1.定义于函数体内的内置类型的对象如果没有初始化,则其值未定义。类的对象如果没有显示地初始化,则值由类自己确定
2.c++是一种静态类型语言,其含义是在编译阶段检查类型。检查类型的过程叫类型检查。对象的类型决定了对象能参与的运算。所以编译器必须知道每一个实体对象的类型,并要求我们在使用某个变量之前必须声明类型。
3.变量命令规范:
-
1. 标识符要体现含义
2. 标识符必须由字母或i者下划线开头,大小写敏感,关键字不能做标识符
3. 变量名一般小写,如index ,不能使用Index INDEX
4. 用户自定义的类名一般是以大写字母开头,如 Student
5. 如果标识符由多个单词组成,则单词之间有明显区分,如 student_num / studentNum4.(一般意义上为左值引用)引用:reference 给对象起一个别名,定义引用时,程序把引用和它的初始值一直绑定在一起,而不是初始值赋值
基本语法: 数据类型 &别名 = 原名
一条语句中可以定义多个引用,且类型要相同
int a =10; int &b = a;
//a ,b 指向的同一块内存 b = 100;
cout << a<< b<<endl; //a=b=100;
引用必须初始化且初始值必须是一个对象,一旦初始化之后就不能更改 因为引用本身不是一个对象,所以不能定义引用的引用
int a=10;int &b = a;
int c= 90;b =c; //赋值而不是引用cout << a << b<<c<<endl; //a=b=c=90;
// 引用传递:(形参修饰实参不需要解引用)
void swap(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
int a=29;int b=90;
swap(a,b);
引用做函数返回值:(不能返回局部变量的引用)
引用的本质:
在c++中内部实现是指针常量
int &b = a
编译器转换为 int* const b = &a;
指针指向不能改,也说明引用不能更改b=20;
*b = 20; //解引用
5.指针(pointer):
和引用的不同点:
1.
指针本身就是一个对象,允许对指针进行赋值和拷贝,在其生命周期内可以先后指向多个对象
2.
指针无须在定义时初始化,和其他内置类型一样,在作用域内为初始化的话,也会拥有一个不确定的值
3.
指针存放某个对象的地址,引用只是某个对象的别名
void *指针:可用于存放任意对象的地址。但对该地址类存放什么类型的对象并不清楚
int a = 2,*b = &a;
void *p = &a; //存放任意类型的对象
p = b;
6.如果想在多个文件中共享使用同一个const对象,必须在变量定义之前,头文件中添加extern关键字
7.constexpr:c++11允许使用constexpr关键字来声明一个常量表达式
如果使用了constexpr声明了一个指针,限定符只对指针有效,对指针指向的对象无关
const int *p = nullptr; //指向整形常量的指针
constexpr int *q = nullptr; //q是指向整数的常量指针
8.auto关键字:自动推导变量对象类型。
使用引用其实是使用引用绑定的对象,auto声明时是以引用对象的类型进行推导
auto一般会忽略顶层const ,同时底层const会保留下来
const int ci = 0;
auto a = &ci; //对常量对象取地址是一种底层const
9.decltyde类型标识符
c++11引入了该类型,它的作用是选择并返回操作数的数据类型,同时编译时只是分析表达式并得到它的类型,却不实际计算表达式的值
decltyde(f()) sum = x;
//函数f()的返回类型就是sum 的类型
decltyde 和引用:
decltyde((var)) (双层括号)的结果永远是引用,而decltyde(var) 的结果只有当var本身就是一个引用才是引用
10.class 和struct的区别:
class和struct 都是定义数据类型,区别在于默认的访问权限不同,class的默认访问权限是private,struct是public
并且class类的实例化对象可以继承,而struct不能