C++ PRIMER 5th 学习小结(第二章)

本文为阅读C++ primer 5th 中自己感觉重要的一些点,方便自己以后复习查阅。

本文将长期更新。

1.在代码块中使用全局变量(在代码块变量名与全局变量名冲突的前提下):在变量前面加scope operator(就是::),这会覆盖作用域规则,而因为全局变量的namespace是空,就会调用全局变量。

2.C++中的引用类型:引用就是一个变量的另外一个名称(一辈子都不能分开),所以引用声明时必须初始化(出生必须有女票),不然会报错。 注意!引用不是对象!引用只是一个别名。另外,引用绑定的一定要是对象,不能是literal或者运算结果。书上说引用不能绑定引用,但我试了试可以。。。不知道为啥。。

int a;
int &a_refer=a;

3.不能定义指向引用的指针,但亲测成功了。不知道为啥。

#include<cstdio>
#include<iostream>
int aa=5;
int main(void)
{
    int aa=4;
    int &aa_r=aa;
    int *bb_r=&aa_r;
    std::cout<<*bb_r<<std::endl;
    return 0;
}

4.定义空指针的方法:

int *p1=nullptr;
int *p2=NULL;
int *p3=0;

5.定义指向指针的引用

int *&p;

6.const变量和多文件的关系

我们知道,在 C++(但不是在 C 语言)中,const 限定符对默认存储类型稍有影响。在默认情况下,全局变量的链接性为外部的,但 const 全局变量的链接性为内部的。也就是说,在 C++ 看来,全局 const 定义就像使用了 static 说明符一样。

要想在其他文件中使用该const常量,可以用extern(定义,声明前面都加).但是一般都放在头文件里,这样比较方便。但是注意指针常量的情况!(不同位置的const)

7.指向const的引用

//同常量指针相同,正规形式:

const int x;

const int &px=x;

//邪门形式

int x;

const int &px=x;//该引用无法修改对象的值

//错误形式

cosnt int x;

//讲道理我觉得这部分C++ primer 讲的没有C primer plus好推荐看一下C primer plus

另外,可以把此引用绑定到非int类型,会进行类型转换并绑定到一个临时变量上。详见C++ primer2.4.1
8.常量表达式:值不会改变并且在编译过程中就能得到计算结果的表达式。注意用常量表达式初始化的const对象也是常量表达式。

const int sz=get_size();//NO!
const int x=5;//YES!
const int y=x;//YES!

9.constexpr: C++11 新标准规定,允许将变量声明为constexpr类型以便由编译器来检查变量的值是否是一个常量表达式。
注意,函数的返回值也可以是constexpr类型,前提是编译时其返回值就可以得到。
注意,constexpr指针必须指向固定地址或者0.在函数体内定义的变量一般来说并非存放在固定地址中,相反的,定义于所有函数体之外的对象的地址不变,能用来初始化constexpr指针。

#include<cstdio>
using namespace std;
constexpr int getsize(void)
{
    return 10;
}
int main(void)
{
    constexpr int mf=getsize();
    return 0;
}

//可行
#include<cstdio>
using namespace std;
constexpr int getsize(void)
{
    int sum=0;
    for(int i=1;i<100;i++)
        sum+=i;
    return i;
}
int main(void)
{
    constexpr int mf=getsize();
    return 0;
}
//报错

10.字面值类型 literal type:可以赋值给constexpr的类型。算数类型、引用、指针都属于字面值类型。
11. 注意!constexpr类型指针指的是顶层常量指针!
12. auto类型为编译器自动给你推断类型,而当auto 碰到const的时候,会有很复杂的情况出现。首先,规则一:auto会忽略顶层const,但会保留底层const。

const int ci=i,&cr=ci;
auto b=ci;//b是一个整数(ci的顶层const特性被忽略了)
auto ptr=&ci;//ptr是一个指向const int的指针(底层const被继承)

想要保留顶层const需要自己加:

const int ci=i,&cr=ci;
const auto b=ci;

如果将引用的类型设置成auto,则有如下规则二:
初始值的顶层底层const属性全部继承。
这样一来,就有了非常复杂的用法。。。。
我觉得过了一个星期我就看不懂了,所以以后千万不要用了

const int ci=i,&cr=ci;
auto k=ci,&l=i;//此处没有对auto的引用,所以应用规则1,ci视作int;第二个是对auto的引用,所以应用规则2,i视作int,正确
auto &m=ci,*p=&ci;//此处为对auto的应用,应用规则2,ci视作const int;此处应用规则1,保留底层const,&ci是指向const int的指针,正确
auto &n=i,*p2=&ci;//错误

真是TM活见鬼了谁他妈会脑抽用这个。。。。
13.decltype()的使用
decltype(x),其中x为expression,返回值为其类型。

decltype(f()) sum=x;

事实上程序并没有调用f,只是将sum定义为把f会返回的类型,并初始化为x。
14.decltype()与引用:
重要!!对一个指针解引用操作得到的是一个引用类型。

int *ptr=&I;
decltype(*ptr) b;//wrong!b是一个对int的引用需要初始化

这里是为了啥呢?我他妈要骂娘了!反正C++11标准里有:

if e is an unparenthesized id-expression or an unparenthesized class
member access (5.2.5), decltype(e) is the type of the entity named by
e. If there is no such entity, or if e names a set of overloaded
functions, the program is ill-formed; otherwise, if e is an xvalue,
decltype(e) is T&&, where T is the type of e; otherwise, if e is an
lvalue, decltype(e) is T&, where T is the type of e; otherwise,
se, decltype(e) is the type of e.

简单翻一下,如果 decltype 的对象是一个表达式且是一个左值,则结果是它的引用类型。表达式指的就是有多余括号。为啥你去问标准制定者吧,我已经骂娘了。
15.现在不太懂:赋值是会产生引用的一类典型表达式。
例如:(a=b)这个表达式返回值是一个引用,指向左值的类型。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值