4.1全局变量的检测增强
c语言中通过
int a = 10;//定义
int a; //声明
c++中
int a = 10;
//int a; //这里会发生错误,提示 int a 重定义
C++中所有的变量和函数都必须有类型
c语言中的形参可以不用声明数据类型
int func1(i)
{
printf("%d\n", i);
return 0;
}
int func2(i)
{
printf("%s\n", i);
return 0;
}
c++中不可
4.3 更严格的类型转换
C++中不同类型的变量是不能直接赋值的,需要相应的强转
typedef enum COLOR {GREEN,RED,YELLOW} color;
void c2cpp_test_4_3()
{
color mycolor = GREEN;
//mycolor = 10; //c中能通过, c++中不能通过因为mycolor是color类型不能被其他类型赋值
}
4.4 struct类型加强
c语言中定义结构体变量时需要添加struct关键字,而c++中不需要
c语言中的结构体只能定义成员变量,不能定义成员函数,c++中既可以定义成员变量,也可以定义成员函数
struct cppstruct {
string mName;
int mAge;
void setName(string name) { mName = name; }
void setAge(int age) { mAge = age; }
void showcppstruct()
{
cout << "name:" << mName << "Age:" << mAge << endl;
}
};
void c2cpp_test_4_4()
{
cppstruct cpp;
cpp.setName("4.4");
cpp.setAge(1223);
cpp.showcppstruct();
}
新增bool类型关键字
bool类型占1字节大小(但只是用其中一位), 值为 true或false,并在给bool类型变量赋值时若所赋的值为非零,则其变量的值为true。
void c2cpp_test_4_5()
{
cout << sizeof(false) << endl;
bool flag = true;
flag = 100; //flag 仍为1
cout << flag << endl;
}
4.6三目运算符功能增强
c语言中三目运算表达式返回值为数据值,为右值,不能赋值
int a = 10;
int b = 20;
printf("ret:%d\n", a > b ? a : b); //返回20 此时变量 a = 10 , b = 20
c++中三目运算表达式返回值为变量本身的引用,为左值,可以赋值。
int e = 10;
int b = 20;
void c2cpp_test_4_6()
{
printf("ret:%d\n", e > b ? e : b); //返回 b 此时变量 a = 10 , b =20
//c++新用法
(e > b ? e : b) = 100;
printf("b:%d\n", b); //返回 b 此时变量 a = 10 , b =1001
}
C/C++中的const
const概念:const字面意思是常量,不变的,它是c/c++中的一个关键字,是一个限定符,它用来限定一个变量不允许改变,它将一个对象转换成一个常量。
const int const_test = 10;
// const_test = 100; //报错
全局范围中:
在c语言中的const直接分配内存到只读数据段,该const修饰的变量具有extern功能是外部链接的。
在c++中,const不必创建内存,全局const当声明extern或者对变量进行取地址时,编译器会分配存储地址,变量存储在只读数据段,两个都受到只读数据段的保护,不可修改,且const不具备外部链接功能,只能在本文件中使用。
局部范围中:
语言中局部const存储在堆栈区中,只是不能通过变量直接修改const只读变量的值,但是可以跳过编译器的检查,通过指针间修改const值。
c++中对于局部的const变量要区别对待:
(1)对于基础数据类型,也就是const int a = 10这种,编译器会把它放到符号表中,不分配内存,当对其进行取地址操作时,会分配内存。
(2)对于基础数据类型,如果用一个变量初始化const变量,如果const int a = b,那么就会给 a分配内存。
void c2cpp_test_4_7()
{
const int constA = 10;
int *p = (int *)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;
int d = 10;
const int a = d;
int * p2 = (int *)&a;
*p2 = 300;
cout << "a:" << a << endl;
cout << "d:" << a << endl;
cout << "*p2:" << *p << endl;
}
运行结果:
constA:10
*p:300
a:300
d:300
*p2:300