C++高级编程 第十二章: 理解C++的疑难问题

来源:互联网 发布:淘宝骗术大全 编辑:程序博客网 时间:2024/05/11 14:00

这一章我觉得讲的有点乱啊…..什么叫疑难问题….我觉得都差不多, 就是把几个关键点柔和了把 . 书上说都是一些比较费解的知识点……shit

1.引用

引用可以理解为变量的别名, 当修改引用时, 它指向的变量也会跟着改变(很像指针但又不是指针),所以我们称为隐式指针.

然后就是我们在定义一个引用时就要对它进行赋值,初始化的时候就要赋值,而且啊,不能改变这个引用指向的对象……..

然后就是除非引用指向const对象,否则无法指向一个立即数对象.
例如 int &a=5//error
再例如 swap(3,4);//
这样子我们相当于把一个常量来初始化引用变量. 如果是这样, 貌似是传是能传进去,但是const限定符将会被自动丢弃

以上的都是旧知识喇

接着我们来看指针引用和引用指针

草泥马 很拗口…狗屎

指针的引用:本质就是一个引用!!!然后这个引用绑定了一个指针对象.
引用的指针: 本质就是一个指针!!!这个指针指向了一个引用.但是!!! 引用我们知道是一个别名而已!!! 它不占任何内存空间!!! 所以我们用一个指针指向这个不占任何空间的别名,就是毫无意义! 所以不存在引用的指针.
引用的引用: 这个到时候我再天机…

还有一个就是

当我们的函数要求传引用, 但是我们所具有的对象都是指针, 此时我们就把指针传进去, 让编译器自己去取这个(指针指向的值)的引用
例如: swap(*p1,*p2);//

2.关键字疑点

2.1 关键字const

妈的: const 就是指定声明的内容 不许发生变化!!! 用于标识变量和函数!

顶层const: const int *p1=&a; 就是这个*p1 不可以指向别的值了(指针指向的值不可以改变)但是 p1可以指向别的变量.
底层const: int *const p1=&a; 就是这个p1 不可以指向别的值了(指针不可以指向别的地址)但是*p1可以改变值.

注意 const int &p1 = z; 和 int const &p1=z; 两者表达的意思是一样的!

2.2 关键字static

操:就是在类里面, 静态成员函数只能调用静态成员不可以调用非静态成员

然后就是: C++ 链接里面 有分 外部连接, 内部连接

外部链接: 就是我们在link其他文件的时候, 当前文件的某一个名字在其他文件里也可以用得到.
内部链接: 就是当前的文件的某一个名字仅局限于这个文件使用.
函数和全局变量呢默认都是外部链接
当我们在其声明加上static关键字,来指定其变成内部链接.

2.3 关键字extern

用来为位于它前面的名字声明为外部链接.
把一个名字定义为ectern时, 编译器会把它当作声明而不是定义来对待, 对于变量来说, 意味着编译器不会对这个变量分配空间.
也就是尽量不要
extern int a;//
要声明和定义同时进行
extern int a=1;//

2.4 关键字typedf

STL 大量使用了typdef在定义较短的类型名称, 例如
typedf basic_string string

2.5 类型转换

const_cast
去掉类型的const或volatile属性。

static_cast
类似于C风格的强制转换。无条件转换,静态类型转换。用于:
1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的;但父类指针转换成子类指针是不安全的。(基类和子类之间的动态类型转换建议用dynamic_cast)
2. 基本数据类型转换。enum, struct, int, char, float等。static_cast不能进行无关类型(如非基类和子类)指针之间的转换。
3. 把空指针转换成目标类型的空指针。
4. 把任何类型的表达式转换成void类型。
5. static_cast不能去掉类型的const、volitale属性(用const_cast)。

dynamic_cast
有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL)
1. 安全的基类和子类之间转换。
2. 必须要有虚函数。
3. 相同基类不同子类之间的交叉转换。但结果是NULL。
  
reinterpreter_cast
仅仅重新解释类型,但没有进行二进制的转换:
1. 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。
2. 在比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
3. 最普通的用途就是在函数指针类型之间进行转换。
4. 很难保证移植性。

3.头文件

头文件就是要来先当于提供了一个接口, 一种抽象的机制, 但是 譬如我a文件包含了b 然后b又包含了c c又包含了a 那是不是重复包含了.

所以我们采用#ifndef 机制可以避免循环包含和多重包含, 在每一个头文件的开始#ifndef就会进行检查, 看某个特定的键是否未定义, 如果定义了,编译器就会跳到与之匹配的#endif
.#endif一般放在文件末尾, 如果所检查的键没有定义, 该文件则会定义这个键, 这样下一次包含这个文件就会直接跳过.

原创粉丝点击