参加了几次笔试, 发现有很多 c++ 方面的问题被卡了从现在开始进攻 c++ 之后会陆续更新 c++ 学习笔记
先说说我学习的书籍, 大家如果有好的书籍推荐, 感谢留言
暂时是在看这些书自学
1.C++ 介绍
c++ 介绍
C 几乎是 C++ 的一个子集, 所以 C 语言支持的语法在 C++ 基本都支持并需要使用 C plus plus(C++), 所以在 C 的基础上又有了很多新的特性
2. 为什么 C++ 支持重载? C 语言不支持重点
** 先说说什么是重载:**C++ 允许多个函数拥有相同的名字, 只要它们的参数列表不同就可以, 这就是函数的重载 (Function Overloading) 借助重载, 一个函数名可以有多种用途
举个例子:
- void Func( )
- {
- int x = 0, y = 0;
- x = x + y;
- }
- void Func(int x, int y)
- {
- int sum = x + y;
- }
- int main( )
- {
- Func( );
- Func(4,5);
- return 0;
- }
这就是函数重载重载支持函数的参数列表不同参数列表是指参数的类型和参数的个数
参数的类型有点不好理解举个例子
- func(int x,int y);
- func(int x,char y);
- func(char x,int y);
上面三个函数相互构成重载所以参数类型指的是两个函数的得参数对应位置的类型
再来说说为什么 C 语言不支持重载, 而 c++ 支持
这个不许深入到底层去探个究竟, 这里我们要看底层汇编代码(我们在 linux 平台下查看汇编代码, 分别采用 gcc 和 g++ 编译)**gcc 一遍自带, g++ 需要自己安装, 安装只需输入:
- yum install gcc gcc-c++
- **
下面是执行过程:
从图中可以看出, C 语言和 c++ 在底层的函数解析规则不同, 导致 C 语言不支持从重载
3. 缺省参数
定义: 就是在声明函数的某个参数的时候为之指定一个默认值, 在调用该函数的时候如果采用该默认值, 你就无须指定该参数
看个栗子:
- int Add1(int a, int b)
- {
- return a + b;
- }
- int Add2(int a, int b = 1)
- {
- return a + b;
- }
- int main( )
- {
- printf("%d\n",Add1(1, 2));
- printf("%d\n", Add2(1));
- printf("%d\n", Add2(1,2));
- system("pause");
- return 0;
- }
看看结果
函数在定义时给了默认值, 调用时如果传了参数就用实参, 如果没传就用默认值这个作用在后面学习类的构造函数很有用
当然缺省参数也有一定的规则: 调用时你只能从最后一个参数开始进行省略, 换句话说, 如果你要省略一个参数, 你必须省略它后面所有的参数, 即: 带缺省值的参数必须放在参数表的最后面 缺省值必须是常量显然, 这限制了缺省参数的数据类型, 例如动态数组和界面类型的缺省参数值只能是 nil; 至于记录类型, 则根本不能用作缺省参数 缺省参数必须通过值参或常参传递
4. 命名空间
以关键字 namespace 开始, 其后接命名空间的名字:
- namespace myname1
- {
- int a = 1;
- }
- namespace myname2
- {
- int a = 5;
- }
命名空间的名字在其所在作用域中是唯一的, 命名控件可以在全局作用域或者其它作用域内部定义, 但是不能在函数或者类的内部定义
每个命名空间都是一个作用域:
这就不会出现 C 语言中的命名冲突问题像上面的代码有两个变量 a, 但是不会出现命名冲突
从命名空间外部使用命名空间成员:
myname1::a;
当我们使用该变量时要加上作用域限定符
命名空间可以嵌套定义:
- namespace myname2
- {
- int a = 5;
- namespace myname3
- {
- int a = 10;
- }
- }
这样是可以的
以上运行结果:
注意: 命名空间作用域不能以分号结束
专栏链接: https://blog.csdn.net/column/mycolumn.html
来源: https://blog.csdn.net/qq_38646470/article/details/79668635