一、变量的声明与定义区别——extern关键字作用
注意:const定义的变量例外,如a.cpp和b.cpp中都定义了const int a = 100;则不会报错的,具体原因查看const那节。
二、变量的初始化、赋值区别
三、引用与指针
左值引用与右值引用
引用使用注意点:
如何理解引用不是一个对象?
一个对象一般有两方面的属性: 1, 存储位置,即该对象的地址;2, 值属性,即对象存储的具体值。因为引用本身不占用存储位置,它只是另外一个对象的别名而已,即不具备上述对象属性的第一点,所以不能算作对象。其实简单试验一下就知道了,如果引用自己占用存储空间(类似指针), 我们获取引用的地址应该与其所引用的对象的地址不同才对,比如:
int a, &ref = a;
cout<<" &a = "<< &a <<", &ref = "<<&ref< 我试验的结果是: &a = 0x22fe44, &ref = 0x22fe44 可见二者的地址相同,ref并没有占用单独的存储空间 void*指针 指针使用注意点 任何非nullptr的指针,放在if语句中都是true。 指针之间可以进行比较操作,如果两个指针指向同一个地址,则返回true,否则返回false。 指向指针的指针 指向指针的引用 指针与引用区别 int i = 1024, *p = &i, &r = i; 这样是定义出了三个变量,分别是一个基本类型,一个指针,一个引用。 千万不要写成 int* a, b;以为这样就定义除了两个指针,其实不是的,a是一个指针,但b仍然是一个变量,因此在定义指针与引用时,最好写成:int *a, *b, &c; 四、const作用 const变量必须在定义的时候就初始化赋值(与java区别) 如果想在多个文件之间共享const变量,则必须在定义的时候也加上extern。 1. const引用 严格来说,不存在常引用,因为引用本身不是个对象,另外根据引用特点可知,一个引用跟变量绑定后就无法再绑定到其他对象了,所以引用本身也就是不变的。常说的常引用是指用const修饰的引用,它的出现是由于对于常量对象必须使用常引用,但也允许常引用绑定到非常量的对象、字面值、甚至是一个一般表达式。 const引用与非const引用指向非常量对象时的区别: char a = 100; int &r3 = a; // 编译错误 const int& r4 = a; // 编译成功 const引用与非const引用区别 r的值还为100。 当const引用指向一个非常量对象时,这个对象还是可以通过别的途径更改其值得,如上面代码所示。 2. const指针与指针const 首先要阐述的一点,为了学习方便,叫法可能和教材有出入,我这里的const指针为:指向const对象的指针,其写法如:const int *ptr; 而指针const是指该指针本身就是一个常量,它一旦指向一个地址后,便不可再改变,其定义如:int *const ptr; 2.1 const指针 要想指向const对象的地址,只能使用const指针,这一点和const引用相同; 另一点和const引用相同的是,const指针也可以指向非const的对象,这种情况下,对象的值无法通过const指针修改,但是却可以通过其他途径修改; 但和const引用不同的是,const指针的类型无法指向不是这个类型的对象,如: int a = 10; const double *ptr = &a;是错的。指针的类型必须与其所指向的对象的类型一致。 2.2 指针const 指针是对象而引用不是,因此就像其他对象类型一样,可以把指针本身定义为常量。同常量对象的性质一样,它必须在定义的时候就显示初始化,否则编译失败,如: 指针是一个常量并不意味着无法通过其修改所指向对象的值,能否这样做完全取决于对象是不是const的。如上所示,由于a不是const,所以通过ptr_const可以修改a的值。 3. constexpr与常量表达式 常量表达式是指值不会改变,并且在编译阶段就能得到结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。如: const并未区分出编译期常量和运行期常量; 说的直白点,const修饰的变量是运行时不可改的,而constexpr修饰的变量就真的是常量,编译时就确定其值了,所以constexpr更接近常量的概念。 4. const函数char a = 100;
const int &r = a;
a = 120;
std::cout << "r = " << r << std::endl;
int a = 100;
// int *const ptr_const; // 不显示初始化错误
int *const ptr_const = &a; // 指针const,说明是一个值不变的指针
const double pi = 3.14;
const double *const const_ptr_const = π // const_ptr_const既是一个指向常量的指针,本身又是一个常量
constexpr限定在了编译期常量;



