C++第2课:C语言变量与C++变量

一、变量声明的位置‌

‌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; // 避免全局名称冲突
}