const 限定符
定义变量加入const可以让它的值不能改变,觉得值不合适也可以修改(表示缓冲区大小的时候),防止程序一部下新改变了这个变量.
1、const与基本类型
const char m; //限定m不可变。
2、const与指针
1)、const在*前面
const char *p; //*p是const, p可变
char const * p;// *p是const, p可变
2)、const在*后面
char * const p; //p是const,*p可变
3)、const在*前面及后面
char const* const p;// p和*p都是const
const char* const p; //p和*pt都是const
(1)const在前,即表示*p不能变,但p能变;const在后面,就表示p不能变,*p能变。
(2)const与char前后顺序并不重要
注意:const (char ) p;和(char ) const p;这是错误的,括号会被当成强制类型转换。
const限制变量使用规则
1、常量或非常量数据的地址都可以赋给指向常量的指针;
2、只有非常量数据的地址才能赋给普通指针。
其实很好理解,如果我们允许一个普通指针指向一个常量数据,那通过指针就可以修改不允许修改的常量。
引申:
1)如果函数的某个参数(指针)是const的,则可以接受指向常量的指针以及普通指针作为实参;
2)如果函数的某个参数(指针)不是const的,则只能接受普通指针作为实参;
auto类型说明符
C++11新标准引入auto类型说明符,用它就能过让编译器替我们去分析表达式所属的类型.
//由val1和val2相加的结果可以推断出item的类型
auto item = val1 + val2; //item初始化为val1和val2相加的结果
const int ci = i,&cr = ci;
auto b = ci;//b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr;//c是一个整数
auto d = &i;//d是一个整形指针
auto e = &ci;//e是一个指向整数敞亮的指针(对常量对象取地址是一种底层const)
const auto f = ci;
auto &g = ci;//g是一个整型常量的引用,绑定到ci
auto &h = 42;//错误,不能为非常量引用绑定字面值
const auto &j = 42;//正确,可以为常量引用绑定字面值
自动变量,自动获取类型,可以自动实现一维数组的循环,对应必须是常量。
函数参数中不允许出现自动变量。
例如:
1.c
//错误
//j是一个变量
//a是一个指针变量
int a[2][2] = {1,2,3,4};
for(auto i : a)
{
for(auto j : i)
cout << *(i + j) << endl;
}
//只能这样吧
int a[2][2] = {1,2,3,4};
for(auto i : a)
{
for(int j; j < 2; j++)
cout << *(i + j) << endl;
}
int&
是引用,引用是什么?别名.别名是什么?另一个名字.
decltype类型指示符
为了希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量.C++新标准引入了第二种类型说明符decltpe,它的作用是选择并返回操作数的数据类型.
decltype(f()) sum = x;//sum的类型就是函数f的返回类型
编译器并不实际调用函数f,而是使用当调用发生时f的返回值的类型作为sum的类型.换句话说,sum的类型就是f被调用返回的那个类型.
1.如果表达式的内容是解引用操作,则decltype将得到引用类型.
//decltype的结果可以是引用类型
int i = 42 ,*p = &i ,&r = i;
decltype(r + 0) b;//正确,加法结果为int型,因此b是一个(未初始化的)int
decltype(*p) c;//错误,c是int& ,必须要初始化
2.赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型
int a = 3,b = 4;
decltype(a = b) d = a; //a是int型,所以b是int&
如果是
decltype(a = b) i;//错误,会报错
3.decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当varuable本身是一个引用时才是引用.
decltype(&p) 结果是int ** .
综合:
auto get(int a, double b)->decltype(a*b)
{
return a*b;
}
预处理器的概述
头文件保护符
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
#endif