1,静态类成员变量必须在类外进行初始化。
详见这篇文章
2,引用必须进行初始化,如:
在这里,b是会报错的。
这样才不会。但是在函数形参那边的引用就不用这样写啦。
3,数组作为函数引用形参
4,临时对象,关于临时对象的介绍看这篇文章,再来看下面这道题:
5,关于类的组合和类的继承相结合的构造顺序
看下面这段代码,写出其执行结果。
#include <iostream>
using namespace std;
class Base1 { //基类Base1,构造函数有参数
public:
Base1(int i) { cout << "Constructing Base1 " << i << endl; }
~Base1() { cout << "Destructing Base1" << endl; }
};
class Base2 { //基类Base2,构造函数有参数
public:
Base2(int j) { cout << "Constructing Base2 " << j << endl; }
~Base2() { cout << "Destructing Base2" << endl; }
};
class Base3 { //基类Base3,构造函数无参数
public:
Base3() { cout << "Constructing Base3 *" << endl; }
~Base3() { cout << "Destructing Base3" << endl; }
};
class Derived : public Base2, public Base1, public Base3 {
//派生新类Derived,注意基类名的顺序
public: //派生类的公有成员
Derived(int a, int b, int c, int d) : Base1(a), member2(d), member1(c), Base2(b) { }
//注意基类名的个数与顺序,注意成员对象名的个数与顺序
private: //派生类的私有成员对象
Base1 member1;
Base2 member2;
Base3 member3;
};
int main() {
Derived obj(1, 2, 3, 4);
return 0;
}
这是一个关于组合类和多继承的构造,这种的构造为先构造继承的基类,基类的构造顺序为派生类继承的顺序,比如这道题为Base2、Base1和Base3,那么构造顺序就是先Base2后Base1,然后在Base3。接下来就是对组合进行构造,也是按照顺序来进行构造,依次是member1、member2和menber3,最后就是派生类自己了。这里我们要知道,构造函数的顺序跟派生类里面的书写顺序没有关系。那么这道题的答案就是:
Constructing Base2 2
Constructing Base1 1
Constructing Base3 *
Constructing Base1 3
Constructing Base2 4
Constructing Base3 *
Destructing Base3
Destructing Base2
Destructing Base1
Destructing Base3
Destructing Base1
Destructing Base2
6,const用法
const可以说是C++一个大boss了,也是一个难点,语法点比较多。
这里只讲一下常量指针和指针常量。
常量指针是指针指向的内容是常量,可以有一下两种定义方式。
const int * n;
int const * n;
(1)常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
int a=5;
const int* p=&a;
a=6;
(2)常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。
int a=5;
int b=6;
const int* p=&a;
p=&b;
指针常量是指指针本身是个常量,不能再指向其他的地址,写法如下:
int *const n;
需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改。
int a=5;
int *p=&a;
int* const n=&a;
*p=8;
总结:
区分常量指针和指针常量的关键在于星号的位置,以星号为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。
int const * n;是常量指针,
int *const n;i是指针常量。