c++学习之c++对c的扩展1

news2024/11/15 15:32:50

目录

1.面向过程与面向对象的编程

2.面向对象编程的三大特点

3.c++对c的扩展:

1.作用域运算符::

2.命名空间

1.c++命名空间(namespace)

2.命名空间的使用

1.在不同命名空间内可以创建相同的名称

2.命名空间只能在全局范围内定义

 3.命名空间可以嵌套

4.命名空间是开放的,可以随时定义新成员到空间中。

5.声明和实现可分离

6.无名的命名空间

7.命名空间别名

3.using声明 命名中的空间成员 可用

using声明成员碰到函数重载

4.C++中形参必须有类型,返回值和实参个数做检测

5.更严格的类型转换

6.结构体增强

在结构体中定义函数

7:新增bool类型关键字

8.三目运算符功能增强


1.面向过程与面向对象的编程

什么是面向过程编辑呢?

举一个例子,我们去实现玩一个下棋游戏的项目,那么我们需要对下棋的所有功能进行实现,从游戏角色,进入游戏,游戏游玩,游戏输赢的判断,退出游戏等所有的过程我们都需要一步步实现。我们需要去分析每一步是如何实现的,这个过程就是面向过程的编译。

那什么是面向对象编程?

面向对象是相对于面向过程一步步实现的特点,面向对象更倾向于模块化的实现,对于’’对象‘‘,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,对象是由一组属性与一组行为构成的。

对象: 世界上任何的事物都可以被抽象成一个对象(属性 +行为)。对于一个下棋游戏,他的属性就是有棋盘,棋子加判断游戏输赢的功能的这样的行为。

2.面向对象编程的三大特点

封装 将属性和方法封装在一起抽象成一个类 并且对类中的成员加以权限控制
继承 将一个类中属性和方法继承到另一个类中
多态    一个接口 对种形态 (静态多态 动态多态)
面向对象编程相对于面向过程编程,更加模块化,是结构化程序因此能有效的将一个都咋的程序设计任务分解成许多易于控制的和处理的子任务,便于开发与维护。

3.c++对c的扩展:

在此之前我们先提一个在C++比较重要的运算符 

1.作用域运算符::

:: 运算符前代表的是一个作用域  。
它的作用是解决归属问题(谁是属于谁的谁),A::变量B,B是来自A的一个变量。
 如果::前面什么都没有加 代表是全局作用域,则可以将该变量转化为全局变量。
比如:
#include <iostream>
using namespace std;
 int a = 100;
void test01()
 {
int a = 10;
cout << a << endl;//输出局部变量a
 cout << ::a << endl;//输出全局变量a
 }
 int main()
 {
 test01();
 return 0;
 }

可以看到这里的::a是一个全局变量了。

2.命名空间

创建名字是程序设计中一项基本的活动,当一个项目很大时,他会不可避免地包含大量名字,c++允许我们对名字的产生和名字的可见性进行控制。我们之前学习c语言可以通过static静态修饰全局变量使丢掉了外部连接属性,只对内部产生作用,在c++中我们可以定义一个作用域来控制对名字的访问。

1.c++命名空间(namespace)

在c++中,名称可以是符号常量,变量,函数,结构,枚举,类和对象等等。我们所创建的工程越大,名字的访问就越有可能发生冲突,其次在使用多个厂商的类库时,也可能会名字冲突。为了避免这样的冲突,引入关键字namespace给出作用空间,能更好的使用名称。

利用namespace我么们可以定义一片区间,其本质是作用域,为的是可以更好的控制标识符的作用域,其次编译器能通过空间名能快速地找到该数据。

命名空间之后 就可以存放 变量 函数 类 结构体 ...各种数据。

2.命名空间的使用

namespace  空间名称           

{

    存放在该空间的各种数据

}    

其次命名空间是有许多特点的:

1.在不同命名空间内可以创建相同的名称

举一个实例,创建两个命名空间 A B分别在里面创建一个名字相同变量,计算机仍可以识别。

#include<iostream>
using  namespace std;
namespace A
{
	int a = 10;
}
namespace B {
	int a = 20;
}
void test()
	cout << "A::a :" << A::a << endl;//10
	cout << "B::a :" << B::a << endl;//20
}
int main()
{
	test();
	return 0;
}

2.命名空间只能在全局范围内定义

错误写法

 

这里会报错,不允许在这里命名,必须在全局范围内,在函数内部也是错误写法。

 3.命名空间可以嵌套

namespace A
{
	int a = 20;
	namespace B
	{
		int a = 10;
	}
}
void test()
{
	cout << "A::a :" << A::a << endl;//20
	cout << "B::a :" << A::B::a << endl;//10
}
int main()
{
	test();
	return 0;
}

可以嵌套命名空间,但在访问名字时注意作用域。

4.命名空间是开放的,可以随时定义新成员到空间中。

namespace A
{
	int a = 20;
	
}
namespace A
{
	int b = 10;
}
void test()
{
	cout << "A::a :" << A::a << endl;//20
	cout << "A::a :" << A::b << endl;//10
}
int main()
{
	test();
	return 0;
}

在定义新成员时,编译器会自动将之前的成员与现在定义的合并在一起。

5.声明和实现可分离

比如声明一个函数,我么既可以在内部直接实现,也可以在外部通过作用域符号实现。
namespace A
{
	int b = 10;
	void test2();
/* void test2()
   {
     cout << "A::b :" << A::b << endl;
   }
*/
}
void A::test2()
{
	cout << "A::b :" << A::b << endl;
}
int main()
{
	 A::test2();//10
	return 0;
}

这里注意必须要使用作用域符号,否则该函数是被认为未在该空间的。

6.无名的命名空间

定义无名的命名空间这里编译器默认为只在该源文件内部可以使用,相当于c中static修饰只能在内部链接,失去了外部连接属性。

但再在定义变量时注意不能与无命名空间里的重命名,否则无法判断,认为是重定义了。

7.命名空间别名

namespace verylongname
{
	int a = 10;
	void fun()
	{
		cout << "haha" << endl;
	}
}
namespace A = verylongname;

int main()
{
	A::fun();
	cout << "A::a :" << A::a << endl;
	return 0;
 }

3.using声明 命名中的空间成员 可用

using编译指令使整个命名空间标识符可用.
并且命名空间标识符如果和局部变量的标识符同名,不会有冲突,优先使用局部变量。
但同时存在弊端。
我们先看直接声明命名空间A后,直接使用A中的成员。
#include <iostream>
 using namespace std;

 namespace A
 {
	 int a = 10;
	 void out()
	 {
		 cout << "haha" << endl;
	 }
 }
 
 int main()
 {
      using namespace A;
	  cout << "A::a为" <<a<< endl;//10
	   out();//haha
	  return 0;
 }

我么也可以声明各个成员再使用:

namespace A
 {
	 int a = 10;
	 void out()
	 {
		 cout << "haha" << endl;
	 }
 }

 int main()
 {
	   using  A::a;
	   using  A::out;
	  cout << "A::a为" <<a<< endl;//10
	   out();//haha
	  return 0;
 }
注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性
比如:
#include <iostream>
 using namespace std;

 namespace nameA
 {
 int a = 10;
 void foo()
 {
 cout << "hello using" << endl;
 }
 }
 void test01()
 {
 //注意: 当using声明的标识符和其他同名标识符有作用域的冲突时,会产生二义性
 int a = 100;
 using nameA::a;
 using nameA::foo;
 cout << a << endl;
 cout << a << endl;
 cout << a << endl;

 foo();

 }
 int main()
 {

 test01();
 return 0;
 }

编译器不知道该变量a到底是属于哪一个a,编译器会报错using声明导致多次声明该变量。

因此最安全的方法是通过作用符号来访问命名空间成员。

using声明成员碰到函数重载

namespace A
{
	void func()
	{
		
	}
	void func(int x)
	{

	}
	int func(int x, int y)
	{

	}
}
void test()
{
	using A::func;
	//因为它们重名,这里访问了空间里的所有函数
	//编译器根据参数或类型,返回来行等看是哪一个函数
}

这里不会产生二义性,但函数一定是有区别的。

这里需要总要说明两点:

4.C++中形参必须有类型,返回值和实参个数做检测

c语言中的函数的形参类型可以不写,没有返回值可以返回,实参的个数不
做检测,
void foo(x,y)
 {
return 100;
 }
 void test01()
 {
 foo(1);
 foo(1, 2);
 foo(1,2,3);

 }

但在c++不行,c++语言中的函数的形参类型必须写,没有返回值不可以返回,实参的个
数做检测
void foo(x, y) // 编译器报错 形参没有类型
 {
 return 100; //编译器报错 没有返回值但是返回了
 }
 void test01()
{
 foo(1);//实参的个数和形参的个数不一致
 foo(1, 2);
 foo(1, 2, 3);//实参的个数和形参的个数不一致

 }

我们在c++中函数名可以重复,编译器会根据函数的返回类型,参数的类型,参数的个数来确定你是其中那一个函数,因此必须要写。

5.更严格的类型转换

c++中对类型转换有严格的要求,需要的类型和给的类型不一致时,可能会编译保存
例如.c语言中这段代码可以编译通过:
void test02()
 {
 char * p = malloc(100);

 }
但是在c++中这段代码编译不通过,需要做类型转换
void test02()
 {
 char * p = (char*)malloc(100);
}

6.结构体增强

c中定义结构体变量时需要struct定义,在c++中不需要。
如简单定义一个学生A
struct student
{
	int age;
	string name;
	char sex;

};
int main()
{
	student A={10,"zhansan",'nan'};
	cout << "A学生的年龄为:" << A.age << endl;//10
	return 0;
	
}

其次还有不同

在结构体中定义函数

struct student
{
	int age;
	string name;
	char sex;
	void setname(string newname)
	{
		name = newname;
	}
	void steage(int newage)
	{
		age = newage;
	}

};
int main()
{
	student A={10,"zhansan",'nan'};
	cout << "A学生的年龄为:" << A.age << endl;//10
	A.setname("lisi");
	cout << "A学生的姓名为:" << A.name << endl;
	return 0;
	
}

这里我们可以学习到关于string函数的一个认识,

string str:生成空字符串

string s(str):生成字符串为str的复制品

string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值

string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值

string s(num ,c):生成num个c字符的字符串

string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值

eg:


    string str1;               //生成空字符串
    string str2("123456789");  //生成"1234456789"的复制品
    string str3("12345", 0, 3);//结果为"123"
    string str4("012345", 5);  //结果为"01234"
    string str5(5, '1');       //结果为"11111"
    string str6(str2, 2);      //结果为"3456789"

7:新增bool类型关键字

c++中可以直接使用bool类型
在c语言中,一下代码中的bool类型,需要包含stdbool.h头文件,但是在c++可以直接使用
void test04()
 {
 // bool类型的变量只有两个值 true false
 //true 和false 可以直接当成常量来用
 bool flag = true;
)

8.三目运算符功能增强

c++中的三目运算符表达式返回的可以是一个变量,但是c语言中返回的是一个常量
c语言中:
//三目运算符
 void test05()
 {
 int a = 10;
 int b = 20;
 printf("%d\n", a < b ? a : b);
 //在c语言中三目运算符返回的是表达式的值,是一个常量
 //(a < b ? a : b) = 100; 编译报错
 *(a < b ?&a :&b) = 100;

 }
c++中:
//三目运算符
 void test05()
 {
 int a = 10;
 int b = 20;
 printf("%d\n", a < b ? a : b);
 //在c++语言中三目运算符返回的是变量
 (a < b ? a : b) = 100;//编译可通过

 }

c++中返回变量,可以被修改,c语言返回常量无法被修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础——异常+IO流资源释放

异常 &#xff08;1&#xff09;什么是异常&#xff1a; 程序在编译/执行的过程中可能出现的问题注意&#xff1a;语法错误不属于异常 &#xff08;2&#xff09;为什么要学习异常&#xff1a; 异常一旦出现了&#xff0c;如果没有提前处理&#xff0c;程序就会退出JVM虚拟…

java的泛型

1. 泛型是什么 ​ Java泛型是J2 SE1.5中引入的一个新特性&#xff0c;其本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数&#xff08;type parameter&#xff09;, 这种参数类型可以用在类、接口和方法的创建中&#xff0c;分别称为泛型类、泛型接口、…

如何开展兼容性测试?兼容性测试有什么作用?

兼容性测试是指测试软件在特定的硬件平台上、不同的应用软件之间、不同的操作系统平台上、不同的网络等环境中是否能够很友好的运行的测试。兼容性测试是软件测试过程中必不可少的一个过程&#xff0c;没有兼容性测试的测试是不完整的测试&#xff0c;下面来分享怎么做兼容测试…

【艾特淘】淘宝卖家如何获取手淘推荐流量?

目前手淘推荐在流量构成中的占比越来越大。平台的推送机制越来越精准&#xff0c;卖家的使用习惯在慢慢改变&#xff0c;因此手淘推荐成了必争之地&#xff0c;尤其是免费的手淘推荐流量&#xff0c;成本很低&#xff01;那么今天就给大家介绍一下手淘推荐的基本操作思路。首先…

【MySQL | 基础篇】04、MySQL 多表查询

目录 一、多表关系 1.1 一对多 ​1.2 多对多 1.3 一对一 二、多表查询概述 2.1 数据准备 2.2 概述 2.3 分类 三、内连接 3.1 案例 四、外连接 4.1 案例 五、自连接 5.1 自连接查询 5.2 联合查询 六、子查询 6.1 概述 6.2 标量子查询 6.3 列子查询 6.4 行…

NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据---大数据之Nifi工作笔记0036

首先拖入一个处理器组,然后把名字修改一下 首先拖入一个处理器组,把名字修改成mysql数据实时采集 然后拖入一个querydatabasetable处理器,然后配置处理器的数据库连接池 创建一个数据库连接池 选择上图中的连接池,然后给service Name改个名字 然后我们点击右边的箭头,然后

用智能手机拍的模糊照片怎么办?学会这个技巧让它变得清晰

智能手机的相机功能越来越强大&#xff0c;但有时候我们还是会拍出一些模糊的照片。这可能是因为手抖或者光线不足等原因导致的。但不要担心&#xff0c;有一些简单的技巧可以帮助您将模糊的照片变得更加清晰。 1.稳定手机 拍摄清晰照片的第一步是确保相机保持稳定。拍照时最…

小技巧 - 王者荣耀战力查询修改战区技巧(轻松拿省标)

项目场景 这个小技巧可能部分资深王者荣耀玩家早就会了哦 主要就是先去查询一下王者荣耀英雄最低战力的战区&#xff0c;再去修改定位到那个地区 这样的话打省标、市标这些会降低不少难度&#xff0c;当然靠实力的就不需要这些花里胡哨了 办法步骤需要的参考哦&#xff0c;…

在Linux中进行Jenkins的yum安装及使用

Jenkins安装在公网IP为y.y.y.y的服务器上 环境准备 第一步&#xff0c;下载jdk-11.0.19_linux-x64_bin.tar.gz安装包。 登录地址&#xff1a;Java Downloads | Oracle 下载jdk-11.0.19_linux-x64_bin.tar.gz安装包&#xff0c;然后使用WinSCP将安装包上传到/usr/local/src文…

windows开启自启动jar包

1.新建txt文本文档 2.复制以下内容&#xff0c;并记得修改 appName 到自己jar包所在目录 并修改jar包名称 3.重命名文本文档.txt为 &#xff08;自己起名字&#xff09;.bat (注&#xff1a;修改成.bat文件&#xff0c;名字自己起) echo off setlocal set appNameD:/tes…

【前端】一个好看的前端页面

序言 突发奇想&#xff0c;看到这个特效还不错&#xff0c;就加工了一下&#xff0c;如果也能帮到你&#xff0c;很开心 先上效果图 部分代码讲解 前端生成uuid function getUUID(len, radix) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.s…

音频相关知识

目录 声音的本质 横波与纵波 为什么固体中既能传输横波&#xff0c;又能传输纵波&#xff0c;液体气体中只能传输纵波 声波 超声波与次声波 声音的三要素 音调 响度 音色 噪声 媒体音频 声道 分类 麦克风工作原理 模数转换 扬声器的使用原理 音频压缩类别 音…

进制数转换知识点总结

二进制和十六进制 用0和1表示各种信息 计算机的电路由逻辑门电路组成。一个逻辑门电路可以看成一个开关&#xff0c;每个开关的状态是“开"&#xff08;高电位&#xff09;或“关”&#xff08;低电位&#xff09;&#xff0c;即对应于1或0 课程推荐 【【计算机科学速成…

gRPC-Go源码解读一 客户端请求链路分析

最近在学习gRPC相关的知识&#xff0c;为啥要学呢&#xff1f;因为一直在用&#xff0c;古人云&#xff0c;“工欲善其事&#xff0c;必先利其器”。为此&#xff0c;花了不少时间阅读gRPC-Go的源码&#xff0c;收货甚多&#xff0c;比如透过服务发现和负载均衡这俩组件来学习复…

腾讯地图获得地图经纬度数据进行描边

场景&#xff1a;地图展示城市或区的描边 方案&#xff1a; 登录腾讯地图 微信小程序JavaScript SDK | 腾讯位置服务 申请密钥 按照步骤获得密钥后 阅读api文档&#xff0c;有各种api获得各类数据 示例&#xff1a;以获得地图区域描边经纬度为例 接口调用&#xff1a;直接浏…

OpenAI最新官方ChatGPT聊天插件接口《插件身份验证》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(三)(附源码)

Plugin authentication 插件身份验证 前言Plugin authentication 插件身份验证No authentication 无认证Service level 服务级别User level 用户级别OAuth其它资料下载 前言 “如果你不能信任插件&#xff0c;那么你就不能信任整个应用程序。”正因为如此&#xff0c;ChatGPT始…

机器人中的数值优化(二)—— 凸函数的性质

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

CentOS7(二)Go、Java、Python、Node开发环境配置

文章目录 Go环境配置Java环境配置Python环境配置Node 环境配置 CentOS7&#xff08;一&#xff09;安装和基础配置 CentOS7&#xff08;二&#xff09;Go、Java、Python、Node开发环境配置 根据前文&#xff0c;我们将所有的自定义环境变量&#xff0c;都收拢在了 /root/.bash_…

如何选一款适合企业的进销存软件?这款软件推荐给你

我们先来聊一聊&#xff0c;什么是进销存&#xff1f; 进销存是指企业管理过程中采购&#xff08;进&#xff09;—>入库&#xff08;存&#xff09;—>销售&#xff08;销&#xff09;的动态管理过程。 再来详细拆解下—— 进&#xff1a;指询价、采购到入库与付款的…

Jmeter实验笔记

Jmeter实验 一、基础操作 启动Jmeter 点击bin目录下的&#xff0c;jmeter进行启动 修改界面语言为中文 发起一个最基本的请求 GET请求 线程组&#xff0c;Http请求&#xff0c;察看结果树 提示:参数、消息体数据这两个按钮是互斥的、只要其中一个有数据&#xff…