typedef
作用:定义别名
用法:typedef oldName newName;
定义四种类型的不同表示:
int:typedef int INTEGER;
数组:typedef int a20[20] ;(注意int [20]是单独的一个类型)
结构体:typedef struct stu{
char name[20];
int age;
char sex;
} STU;
指针:typedef int (*p)[20] ;
和 #define 的区别:
①typedef不能对类型名进行扩展 unsigned INTERGE n; //这是错的
②在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型
const
● 变量——定义为常量,不分配空间,存储在常量区
● 函数的参数——在函数体内不可被修改,本质上仍为变量
● 函数的返回值——①指针,指针内容不能被修改 ②引用,函数体不能作为左值 ③变量,没有意义,返回后就挂掉
● 类内——①数据成员,在对象内是常量 ②成员函数 函数名前:修饰函数返回值,函数名后:常成员函数,函数不能修改对象的成员
● 类外——①对象,对象不能被更新
● 指针——4种情况,注释掉的代码是出错的语句,代表值不可被修改
//这两种方法const都是修饰指针指向的值,但能不能修改取决于a是不是const
int a = 1;
const int* pa = &a;
//int const* pa = &a;
cout << a << endl;
cout << pa << endl;
cout << ++a << endl;
cout << ++pa << endl;
//cout << ++*pa << endl;
//常量
const int a = 1;
const int* pa = &a;
cout << a << endl;
cout << pa << endl;
//cout << ++a << endl;
//cout << ++*pa << endl;
//常指针
int a = 1;
int* const pa = &a;
cout << a << endl;
cout << pa << endl;
cout << ++a << endl;
//cout << ++pa << endl;
//常指针常变量
const int a = 1;
const int * const pa = &a;
cout << a << endl;
cout << pa << endl;
//cout << ++a << endl;
//cout << ++pa << endl;
优点
● 辅助检查,让程序员和编译器知道这是常量,不可被修改,多一重检查,同时也避免了二义性
● C++定义一个常量后,不会为它分配空间,而是写进常量区,这使其成为编译期间的常量,在程序运行时没有了读写内存的操作,提高了程序效率和节省了空间(比 define 的优势)
● 为重载提供了参考,const 对象调用 const 方法,非const 对象调用非 const 方法
● 与 constexpr 的区别:在大部分场景中两者可以混用,但在某些场景,必须使用 constexpr,比如初始化列表必须只能用常量
using namespace std;
constexpr int sqr1(int arg){
return arg*arg;
}
const int sqr2(int arg){
return arg*arg;
}
int main()
{
array<int,sqr1(10)> mylist1; //可以,因为sqr1时constexpr函数
array<int,sqr2(10)> mylist1; //不可以,因为sqr2不是constexpr函数
return 0;
}
const 可以被间接修改,拥有二义性,表达“只读”语义场景用 const,表达“常量”语义场景用 constexpr