从本章起开始从 0 学习 C++, 本章主要内容:
1)C 和 C++ 的基本区别
2)C 和 C++ 的 const 区别
1.C++ 和 C 区别
1.1 C++ 更强调语言的实用性, 所有变量都可以在需要时再定义
比如:
for (int i = 0; i < 100; i++);
1.2 C++ 不允许定义多个同名全局变量, 而 C 却可以重复定义
1.3 C++ 的 register 只是个兼容作用
1.4 C++ 的所有标识符都必须有声明类型
比如, 在 C 中:
f(): 表示默认返回值是 int, 可以接受任意个 int 型参数的函数
在 C++ 中:
int f() int f(void) 表示都一样, 没有参数, 返回值为 int 型的函数
int f(i): 由于 i 没声明类型, 会报错
1.5 结构体升级
例如, 在 C 中定义一个结构体:
- typedef student_type student; // 声明
- struct student_type{
- char *name;
- int age;
- };
- struct student student_info={"Li",20};
- /* 或者 */
- student student2={"Zhang",20};
而在 C++ 中, 只需要这么写:
- struct student_type{
- char *name;
- int age;
- };
- student_type student2={"Zhang",20}; // 不需要 strcut 再次声明
C 和 C++ 的 const 区别
2. C 中的 const
2.1 介绍
C 语言中的 const 只是让变量变为只读属性, 其本质还是变量, 不是真正意义上的常量
(只有 enum 枚举定义的才是常量).
注意: const 变量不能被直接赋值, 但是可以通过指针来修改 const 变量.
由于 const 局部变量会存在栈里, 而 const 全局变量会存在只读存储区
所以我们可以通过指针来修改 const 局部变量, 但是修改 const 全局变量, 会使程序崩溃.
2.2 修改 const 实例
1) 实例 1 - 通过指针来修改 const 局部变量
代码如下:
- #include <stdio.h>
- int main()
- {
- const int c = 0; //const 局部变量
- int* p = (int*)&c;
- *p = 5; // 通过指针修改 const 变量
- printf("c = %d\n", c);
- return 0;
- }
输出结果:
2) 实例 2 - 通过指针来修改 const 全局变量
代码如下:
- #include <stdio.h>
- const int c = 0; //const 全局变量
- int main()
- {
- int* p = (int*)&c;
- *p = 5; // 修改 const 变量
- printf("c = %d\n", c);
- return 0;
- }
输出结果:
由于指针修改只读存储区的数据, 所以导致程序崩溃
3. C++ 中的 const
3.1 介绍
在 C++ 中, const 变量则是真正的常量了, 定义时会将其放入符号表中.
所以编译途中遇到使用 const 变量时, 则直接从符号表中取出常量.
只要当该 const 变量为全局
(使用 extern 声明过
), 或者被使用 & 操作符时, 才会被分配存储空间.
接下来, 我们以一个例子来分析存储空间
代码如下:
- #include <stdio.h>
- int main()
- {
- const int c = 0; //const 局部变量
- int* p = (int*)&c; // 使用 & 操作符, 会分配空间
- *p = 5;
- printf("c = %d,*p=%d\n", c,*p);
- return 0;
- }
输出结果:
为什么输出结果会有两个不同的值?
这是因为使用 & c 时, 会从符号表中取出 c 的值, 并将 0 存在一个新的分配空间地址里,
所以 * p 修改的只是分配出来的空间地址内容, 而 c 还是常量.
3.2 const 和 define 区别
是不是感觉 C++ 中的 const 和 define 宏定义一样? 其实不一样!
const 常量: 由编译器处理, 它会对 const 常量进行类型检查和作用域检查
define 宏定义: 由预处理器处理, 直接进行文本替换, 不会进行各种检查
(预处理器是执行编译器之前运行的程序, 用来删除注释, 宏变量转换等)
接下来, 我们以一个例子来分析 const 和 define
代码如下:
- #include <stdio.h>
- void f()
- {
- #define a 3 // 定义宏
- const int b = 4; // 定义局部变量
- }
- int main()
- {
- f();
- printf("a=%d",a);
- //printf("b=%d",b);
- return 0;
- }
输出结果:
这是因为执行预处理器时, 会将遇见到的所有 a 变为 3, 所以编译器看到的是 printf("a=%d",3);
而取消 //printf("b=%d",b); 屏蔽后, 程序则会报错, 是因为 b 的作用域只在 f() 函数里有效.
3.3 指针 const
指针 const 分为两种: 底层 const, 顶层 const
(
普通变量的 const(或引用) 永远是顶层 const, 也就是说, const int 和 int const 本质都一样)
1) 底层 const(
位于 * 左侧)
常量指针, 表示指向的对象是个常量, 不能修改其内容, 只能更改指针指向的地址,
但是可以通过其它方式修改内容, 例如:
- int a=1,b=3;
- const int *p=&a; // 底层 const
- //*p=2; // 错误, 无法修改 * p 指向的 a 里面内容
- a=2; // 正确, 通过其它方法来修改 * p 的内容
- printf("%d\n",*p);
- p=&b; // 正确, 可以更改指针指向的地址
- printf("%d\n",*p);
输出结果:
2 3
2) 顶层 const(
位于 * 右侧)
指针常量, 表示不能更改指针指向的地址, 只能修改其内容 (定义时必须被初始化)
和引用非常相似, 例如:
- int a=1;
- int b=3;
- //int *const p; // 错误, 没有被初始化
- int *const p=&a; // 顶层 const
- //p=&b; // 错误, 不能更改指针指向的地址
- *p=2; // 正确, 修改 a 的值等于 2
来源: https://www.cnblogs.com/lifexy/p/8436731.html