C++学习路线和相关书籍
上图来源于知乎
C语言书籍:
- C primer plus
- C专家编程
- C和指针
- 你必须知道的495个C语言问题
C++入门:
- Essential C++
- C++ Primer
C++进阶:
- Effective C++
- More Effective C++
- Exceptional C++
- More Exceptional C++
- The C++ standard library
- Effective STL
- Generic programming and the STL
深入C++:
- Modern C++ design
- Inside the C++ object model
一、对象
1.一般规则
- 常成员函数:在函数参数表后加一个const,如 int readi() const; //通过函数读取内容,但此函数的语句不可改变任何成员数据
- 在类外部定义成员函数的格式:返回值类型 类名::函数名(参数表){语句…}
- 同变量的引用,对象的引用也采用&:类名 &对象名a=对象名b; (结果就是取了个别名,对a或b的改动都会影响对方)
- 注意:类的成员应该注明是公有(pubilc)还是私有(private),不注明则默认为私有,但应该养成注明的习惯
- 成员函数的重载中const也是一种重载
如:
class A{
public:
A():i(0){
}
void f(){
cout << "f()"<<endl;} //相当于void f(A* this){...}
void f() const {
cout << "f() const" << endl;} //相当于void f(const A* this) const {...}
};
int main()
{
const A a; //启用的f函数是f() const
a.f(); //结果输出的是f() const对应的结果
return 0;
}
2.一般构造函数
- 会随着对象创建而自动被调用,调用时间:全局对象代码在main函数之前时,可以在main函数之前调用,但不同文件中的全局对象之间的调用顺序会随编译器的差别而不同,若不同文件的全局变量之间有相互依赖则容易出错。
- 是一个与类同名的公有成员函数,且没有返回值,一般用于初始化成员数据或为对象分配资源(如堆内存空间)
- 可以和成员函数重载的概念结合,通过重载多种构造函数参数,实现多种对象初始化操作
- 当一个对象(a)中包含其他对象(b,c,d…)时,可以在a的构造函数定义中调用b,c,d…的构造函数:
格式:类名::构造函数名(参数表):成员对象名(参数表)[,…成员对象名n(参数表)]
注意:当中的成员对象也可以是成员数据(即不是成员函数),如A::A(int ii):i(ii){},其中i是A类里面的一个int数据,此时表示用ii对i进行初始化,等同于在后面的{}里面写i=ii;
a::a(int i, char c):b(j,k),c(f,g),d(x,y){
...
}
注意:在该过程中首先生成的是成员对象b,c,d...
3.拷贝构造函数(复制对象)
3.1拷贝构造函数的一般性质
和一般构造函数的区别在于其参数为已生成的对象
例:
Node::Node(Node &n){
//拷贝构造函数
idata = n.idata; //可以读出同类对象的私有成员数据
cdata = n.cdata;
next = n.next;
}
int main(){
...
Node c(x); //创建一个点c,并将点x复制到点c
}
拷贝构造函数的特点:
- 拷贝构造函数能读相同类对象的私有成员数据
- 其实质是把参数的成员数据全部复制到新的对象里
- 它也是构造函数的一种重载(即参数表形式从一般变量变为对象)
3.2默认拷贝构造函数(浅拷贝)
定义:系统自动给出的,将对象的成员数据全部赋值给新创建对象的成员数据,如果某些成员数据本身就是对象,则自动调用它们的拷贝构造函数或默认拷贝构造函数。
缺点:浅拷贝,无法将动态申请的资源复制过来(如成员数据中有指针,则只能复制指针而不能复制指针指向的内存),在原有数据内存被释放后会导致复制的指针失效。
因此还需要将动态申请的资源也拷贝过来,即深拷贝
3.3深拷贝
在拷贝构造函数中new出新的空间
Linklist::Linklist(linklist &l):head(l.head)
{
cout<<"Linklist Deep Cloner running..."<<endl;
pcurrent=&head;
Node *pt1=l.head.readn(); //该指针用于指向原链表中被复制的节点
while(pt1!=NULL)
{
Node *pt2 = new Node(pt1-