命名空间
实用性增强
C语⾔言中的变量都必须在作⽤用域开始的位置定义!!
C++中更强调语⾔言的“实⽤用性”,所有的变量都可以在需要使⽤用时再定义。
using namespace std; int main(void) { int i = 0; cout << "i = " << i << endl; int k; k=4; cout << "k = " << k<< endl; return 0; }
变量检测增强
在C语⾔言中,重复定义多个同名的全局变量是合法的
在C++中,不允许定义多个同名的全局变量
C语⾔言中多个同名的全局变量最终会被链接到全局数据区的同⼀一个地址空间上
int g_var; int g_var = 1;
C++直接拒绝这种二义性的做法。
struct类型增强
C语⾔言的struct定义了⼀一组变量的集合,C编译器并不认为这是⼀一种新的类型
C++中的struct是⼀一个新类型的定义声明
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; struct Student { char name[100]; int age; }; int main() { Student s1 = { "Yang", 18 }; //C++中可以直接写Student struct Student s2; //C语言中 必须要有 struct类型 不然会报错 system("Pause"); //阻塞功能 return EXIT_SUCCESS; // 返回正常退出 }
C++中所有变量和函数都必须有类型
C++中所有的变量和函数都必须有类型且C++调用函数时必须保持签名一致
C语⾔言中的默认类型在C++中是不合法的
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; f() //缺少显示类型(返回值) { return 10; } int g(int a) { return 5; } int main() { f(); g(1, 2, 3, 4, 5); //函数调用参数太多 system("Pause"); //阻塞功能 return EXIT_SUCCESS; // 返回正常退出
新增bool类型关键字
C++中的布尔类型
C++在C语⾔言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占⽤用⼀一个字节,
如果多个bool变量定义在⼀一起,可能会各占⼀一个bit,这取决于编译器的实现
true代表真值,编译器内部⽤用1来表⽰,只能用1来表示,不管变量值是多少,都会变成1
false代表⾮非真值,编译器内部⽤用0来表⽰
bool类型只有true(非0)和false(0)两个值
C++编译器会在赋值时将非0值转换为true,0值转换为false
三⽬目运算符功能增强
1)C语言返回变量的值 C++语言是返回变量本身 C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值 使用 (a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已
const增强
基础
c语言中的const是冒牌货
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; int main() { const int a = 10; //定义常量 const 意味只读 int const b = 20; //与第一个意思一样, 代表一个常整型数 int tem = 30; const int *c = &a; //c是一个指向常整型数的指针(所指向的内存数据不能修改,但本身可以修改 int * const d = &tem; //d 常指针 (指针变量不能被修改,但是所指向的内存空间可以被修改) const int * const e = &b; //e 一个指向常整型的常指针(指针和它指向的内存空间,均不能被修改) system("Pause"); //阻塞功能 return EXIT_SUCCESS; // 返回正常退出 }
合理的利用const的好处
1指针做函数参数,可以有效的提高代码可读性,减少bug;
2清楚的分清参数的输入和输出特性
int setTeacher_err( const Teacher *p)
Const修改形参的时候,在利用形参不能修改指针所向的内存空间 ???
C中的const是冒牌货
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //using namespace std; int main() { const int a = 10; //定义常量 const 意味只读 int *p = (int*)&a; *p = 11; printf("a=>%d\n", a); //结果变为了11 return 0; }
C++中的const类似于宏定义#define
using namespace std; int main() { const int a = 10; //定义常量 const 意味只读 int *p = (int*)&a; //c++中对一个常量取地址,编译器会临时开辟一个空间temp.让这个指针存放这个临时空间的地址 *p = 11; //改变的是临时空间temp的地址,所以a不会变 *p也不会报错 cout << "a=" << a << endl; cout << "*p=" << *p << endl; return 0; }
C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在 const修饰的常量编译期间,就已经确定下来了
C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
C语言中的const变量 C语言中const变量是只读变量, 有自己的存储空间 C++中的const常量 可能分配存储空间,也可能不分配存储空间 当const常量为全局,并且需要在其它文件中使用,会分配存储空间 当使用&操作符,取const常量的地址时,会分配存储空间 当const int &a = 10; const修饰引用时,也会分配存储空间
枚举的增强
c 语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而 c++中枚举 变量, 只能用被枚举出来的元素初始化。
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; enum season { SPR, SUM, AUT, WIN }; int main() { enum season s = SPR; //s = 0; //error 但是c语言可以通过,相当与SPR s = SUM; //c++中只能用定义的元素 cout << s << endl; //1 system("Pause"); //阻塞功能 return EXIT_SUCCESS; // 返回正常退出 }
结果