C++primer 第二章

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值