C++第2课:C语言变量与C++变量
- C++
- 14天前
- 95热度
- 0评论
一、变量声明的位置
C语言
在C89/C90标准中,变量必须在作用域的开头声明,不能在代码中间声明。例如:
void func() {
int a = 1;
// 其他代码
int b = 2; // C89中编译错误
}
C++
C++允许在代码的任何位置声明变量,只要在使用之前声明即可:
void func() {
int a = 1;
// 其他代码
int b = 2; // C++允许
}
二、初始化方式
C语言
仅支持传统初始化方式,例如:
int a = 5;
C++
支持多种初始化方式,包括列表初始化(C++11引入),可防止窄化转换:
int a{5}; // 列表初始化
int b = {5}; // 带等号的列表初始化
int c(5); // 构造函数式初始化
三、const常量的链接属性
C语言
const变量默认具有外部链接,可能导致重复定义错误。例如:
// 头文件中
const int MAX = 100; // 多个包含此头文件的源文件会链接错误
通常需配合static或extern使用:
static const int MAX = 100; // 每个文件独立副本
C++
const变量默认具有内部链接,可直接在头文件中定义:
// 头文件中
const int MAX = 100; // 安全,每个文件独立副本
四、 布尔类型支持
C语言
在C99标准之前,C语言没有内置的布尔类型,需通过typedef或宏模拟:
typedef int bool;
#define true 1
#define false 0
C++
C++直接支持bool类型,值为true或false:
bool flag = true;
五、结构体/类的成员变量
C语言
结构体不能包含成员函数。
成员变量不能在声明时初始化。
定义变量时需显式使用struct关键字:
struct Point {
int x;
int y;
};
struct Point p1; // C中必须写struct
C++
结构体/类可以包含成员函数和访问控制(如public/private)。
支持成员变量直接初始化(C++11):
struct Point {
int x = 0; // 允许直接初始化
int y = 0;
};
Point p1; // 无需写struct
六、类型安全与隐式转换
C语言
允许隐式类型转换,例如:
int* ptr = malloc(sizeof(int) * 10); // C允许隐式转换
C++
类型检查更严格,需显式转换:
int* ptr = (int*)malloc(sizeof(int) * 10); // C++必须显式转换
七、 auto关键字
C语言
auto表示自动存储类型(默认行为,极少显式使用)。
C++
auto支持类型推断(C++11起):
auto x = 10; // x推断为int
auto y = 3.14; // y推断为double
八、命名空间对变量的影响
C语言
没有命名空间,全局变量可能冲突,需通过前缀或static限制作用域。
C++
可通过命名空间隔离变量,避免全局名称冲突:
namespace MyLib {
int value = 42; // 避免全局名称冲突
}