作为大四应届生o( ̄︶ ̄)o 最近为了后续的面试工作地点看C++primer再次深入学习C++写里一点笔记:
如下:
1. C++四种强制转换:
1、static_cast:可以实现C++中内置基本数据类型之间的相互转换,enum、struct、 int、char、float等。它不能进行无关类型(如非基类和子类)指针之间的转换。
int c=static_cast(7.987);
如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
2、const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
3、reinterpret_cast: (interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。)有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
4、dynamic_cast:
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
2. this指针:
就是函数自身(用一个指针表示)
1
2
3
void&void* 用法:
void真正的用途在下面两个方面:
• 对函数返回值的限定
• 对函数参数的限定
比如,函数没有返回值,那么函数可能会声明成这样:void fun(int a);
如果函数有返回值,但是函数没有参数,那么函数的可能会声明成这样:int fun(void)。
Void* 用法:
• 函数可接受任意类型的指针。
用过memset或者memcpy的细心的人会发现,在gcc中编译类似下面的代码都不会有警告:
int a;
int *p = &a;
memset(p, 0, 4);
或者
char c[4];
char *p = c;
memset(p, 0, 4);
为什么memset传int还是char 都没有问题呢?我们知道不同类型间复制是要进行强制转换的,那么这里为什么不用强制类型转换呢。我们看memset的原型会发现,memset的第一个参数就是void *。
• void *类型可以接受任意类型指针。
1
2
例如:
void *p1;
char *p2 = “hellp”;
p1 = p2;
这是没有问题的,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。但需要注意的一点是,void的类型并不能无需类型转换直接赋值给其他类型,比如malloc的返回值是void ,那么我们一般这样写:charp = (char )malloc(4);
• void *类型不能做运算
1
2
比如我们不要做类似这样的操作:
void *p;
p++;
说白了void并不是一个真实的变量,void可以看作一个抽象概念。
4 构造函数不能用const类型并且构造函数没有返回值!
5.C++有哪几种情况只能用初始化列表,而不能用赋值?
(1)对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表;
初始化与赋值是不同的:
赋值是删除原值,赋予新值,构造函数的意思是先开辟空间然后为其赋值,只能算是赋值,不算初始化;
初始化列表就不一样了,开辟空间和初始化是同时完成的,直接给予一个值;
常量不能被赋值,只能被初始化,所以必须在初始化列表中完成;
C++的引用也一定要初始化,所以必须在初始化列表中完成。
【
1) 引用必须被初始化,指针不必;
2) 引用初始化以后不能被改变,指针可以改变所指的对象;
3) 不存在指向空值的引用,但是存在指向空值的指针。
】
6.C++构造函数初始化列表:
构造函数初始值列表
接下末我们介绍类中定义I`}J } i外两个构造函数:
Sales_ data(const std::string &s):bookNo(s){}
Sales_ data(const std::string &s,unsigned n, double p):
bookNo(s),units-sold(n), revenue(p*n){}
这两个定义了冒号与花括号现了新的部分,即及冒号和花括号之间的代码,其中花括号定义了(空的)函数体。我们把新出现的部分称为构造函数初始值列表(constructor initialize list ),它负J。为新创建的刊象的一个或几个数据成员赋初值构造函数初始仇是成员名字的个
列表,每个名字后面紧跟着括号起来的(或者在花括号内)成员初始化.
7.使用class或struct关键字
class与struct唯一的区别是:默认的访问权限不一样,struct 是public ,class是 private;
其余的struct也能继承派生等等.