C++ primer 5 chapter2 笔记

1.C++支持的数据类型
1)除了常规C的内置数据类型,增加了w_chart, char16_t, char32_t, long long, long double
2)对于char类型,不同的机器实现不同,可能是unsigned char,也可能是signed char。
3)对于整型,浮点型,字符型,字符串型的字面常量,是有默认数据类型的,当然也可以显式的指定字面常量的类型。也有布尔类型和指针类型的字面值。
2.变量
1)C++用户自定义标识符时
(1)连续两个下划线开头不允许
(2)下划线+大写字母不允许
(3)函数外的变量不允许下划线开头
上述只是推荐行为,并不会引起编译错误。是为了防止和标准库里的保留字冲突。


3)变量定义,可以看作数据类型和声明符两部分,声明符有变量名和修饰符组成。修饰符决定了变量的类型是与基本数据类型有关的某种类型,比如是一个int型的引用。
4)extern int a= 0;这样在声明时进行初始化,也是合法的,但此时extern将失去意义,不在是声明,是定义了。将可能引起变量重复定义。
5)增加了列表初始化{}方式,但是不能有精度损失,否则报错。
6)引用型变量必须定义时初始化,且初始值的类型和引用变量的类型必须完全相同,否则编译报错。即使能自动数据类型转换,也不行。不能定义一个指针,其类型是引用。比如int & *p; 引用指向的对象是不能改变的。
7)空指针推荐使用NULL PTR。其实这里作者没有讲明白为啥要用NULLPTR,NULLPTR是一个指针类型,而NULL实质是0,如果给一个被int,和int*分别重载的函数传递NULL,会调用参数类型是int的函数,这就和我们预期不符了,很多时候我们认为NULL是指针类型。
8)对于复杂的变量定义,从靠近变量的地方逐层开始声明符识别。
9)对于const引用,其初始化的值的类型可以和引用类型不同,只要通过转换可以一致即可。const引用可以指向非const的对象,只是此引用自己不能被赋值罢了。

(1)允许const 引用绑定非常量的对象,字面值,甚至是一个表达式。

const int &a  = 0;//ok

int &a = 0;//error

const int & const a =1;//error,不能将引用标识符自身定义为const
const int &a = b; 和int const &a = b;是等价的;

(2)顶层const是指用来修饰变量名的const,底层const是指用来修饰变量的数据类型的const

const int * const p = p1;//左侧的是底层const,靠右的是顶层const

const int i =0;//这里const修饰的是i,因此这里是顶层const

两个对象拷贝时,,顶层const可以不考虑,拷入和拷出队形的底层const必须一致,或者两个对象的数据类型能够转换,一般来说非常量可以转换为常量,反之不行。


(3)const指针可以指向非const对象,指向的对象的类型可以和指针类型不一致,只要可以转换即可。

10)constexpr用于指针变量定义时,只修饰了指针标识符,且必须用必须用NULLPTR或者0初始化,或者是某个固定地址中的对象。

int j = 0;

constexpt int *p = &j;//ok.p是常量指针,指向j,j可以不是const

constexpt int *q = nullptr;//q是一个常量指针,而不是说q是一个指向常量的指针。
11)一般使用auto声明变量时,初始值的顶层const被忽略,如果要保持,需要在auto前显式的指出,同时底层const会保留。如果auto声明的是引用变量,则初始值的顶层const不会被忽略。auto推断的只是基本数据类型,声明修饰符还是要显式指出来,比如是*或者&

(1)使用auto 能在一行声明多个变量,但这些变量的基本数据类型必须一致。

auto i = 0, *p = &i;//ok. i is int, and p is a int pointer

(2)编译器推断出的数据类型未必一定和初始值的类型一致。

如果初始值是一个引用类型,那么auto的类型是引用绑定的对象的类型,而不是引用的类型

int i;

int &r = i;

auto j = r;//这里j会被编译器认为是int 而不是int & 类型

如果初始值有const修饰,编译器推断auto的类型时一般会忽略顶层contst,只保留底层const

const int i = 0;

auto c = i;//c is a int,top const is ignored.

auto d = &i;//这里d是一个指向const int的指针,此时的const是底层const

如果要推断的类型auto的引用或者指针时,初始值的顶层const属性会被保留

const int i = 0;

auto &b = i;//b是const int的引用

auto *c = &i;//c是cont int指针


12)decltype(变量),是能返回顶层const和&的,与auto不同。decltype((变量))返回的就是引用了,如果decltype(表达式)返回的也可能是引用。

decltype(变量) 返回变量实际的类型,如果变量是const或者引用,也会返回对应的const或者引用,这点和auto不同.

decltype((变量))如果是解引用操作,返回结果将是是引用。

int i, *p,&r= i;

decltype(i) 返回int

decltype((i)) 返回int&

decltype(r) 返回int&

decltype(r+0) 返回int

decltype(*p) 返回int&


13)类内初始化成员时,不能用(),据说是为了避免语法分析的歧义。

14)对于cost变量,其作用域是文件内的,即出了文件,其他文件将不可见此const变量的定义。如果在头文件a.hpp中定义一个const变量,比如const int a = 10;当此头文件被不同的文件b.cpp,c.cpp包含时,将分别在其他b.cpp,c.cpp中生成const int a = 10;,相当于有两个const int a = 10;,二者是独立的互补影响的,如果想在不同文件中共享同一个const对象(比如类的某个特殊实例),需要在const对象的定义和声明的地方都增加extern。




疑问:
1)表达式是什么类型呢?为啥delctype表达式会返回引用呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值