1、对strcut关键字的加强,在C语言中
struct Teacher
{
int age;
char name[64];
};
定义一个Teacher,必须写成struct Teacher t1;
而C++中则可以直接写Teacher t1;
在C++中的结构体内可以直接定义函数,也可以定义访问权限
类其实就是结构的数据成员加可执行代码,统一提供封装,继承,多态。
在类内部,没有权限限定符,默认是private
在结构内部,没有权限限定符,默认是public
2、三目运算符的增强:C语言中?:结果不能写在左值上,因为返回的一个数值,一个结果。
C++中 的?:对C语言进行了增强,返回的变量本身,所以C++中的三目运算符,可以用在程序的任何地方。
如何让C语言中的三目运算符写在左值上?
*(a<b?&a:&b)=30;
3、const 变量的增强
C语言中的const修饰的变量,编译器会为其分配内存空间,因此可以使用指针取地址赋值的方式,对变量的值进行修改。C语言中的const变量是一个冒牌货。
注意此时在C语言中被const以后是一个只读变量,而不是常量,所以不能做数组的下标;
只有常量才能做数组的下标。
而在C++中,const修饰的是一个常量,所以可以作为数组下标。
C++中当检测到const修饰的变量以后,会直接以名值对的方式,存在符号表里面。不能修改。
只有当对变量去地址时或者是全局变量,并且用extern修饰时,编译器为该变量分配内存。
int a=10;
int b=20;
arr[a+b];
//这种语法现象在C语言和C++里面都是错误的
//而在Linux内核里面是可以的,因为他的gcc编译器是支持的
#include <iostream>
using namespace std;
void main()
{
const int a = 5;
int *p = (int *)&a;//
*p = 4;//修改的是重新分配的地址内的值内部
cout << a << endl;//5
cout << *p << endl;//4
system("pause");
}
变量不能做数组下标
C语言中const修饰的是只读变量,C++修饰中const修饰的是常量
const和#define的区别
#define完成在预编译阶段,是机械的替换,
const完成在编译阶段,有类型和生命周期的检查。
即在一个函数里面定义的#define变量在其他函数里面也可以用,而const却不行。
void fun1()
{
#define a 10
const int b=10;
#undef a //不想其他程序里面的a,替换成这个程序里面定义的10,此处将a卸载。
//或者将该函数定义的#define 全部卸载
#undef
}