首先,
你可以将构造函数设为private
,但是你就因为外部不能访问private
成员而不能使用这个类。
在C++中,如果你没有为类定义任何构造函数,编译器会为你自动生成一个默认构造函数。但是,如果你已经定义了至少一个构造函数(非默认构造函数),那么编译器就不会再自动生成默认构造函数。
其次,
注意构造函数定义了有参数的,然后你创建了一个什么都没给的Books bo;
,会报错,因为你没定义默认构造函数;当你定义了一个全参数的构造函数,又定义了一个默认构造函数,会报错,因为系统认为这两个都符合。
#include <iostream>
using namespace std;
class Books {
int id;
string name;
public:
Books() {}
Books(int i=0, string n="nope"): id(i), name(n) {
cout<<"Reading is important thing.\n";
}
~Books() {
cout<<"Destroy "<<name<<".\n";
}
void setId(int i) {
id = i;
}
int getId() {
return id;
}
void showId() {
cout<<"id is "<<id<<".\n";
}
};
int main() {
Books bo;
bo.showId();
return 0;
}
直接报错error: call of overloaded 'Books()' is ambiguous
然后,
对于初始化列表,要注意
必须使用的时候 const成员变量
成员变量的初始化顺序只与成员变量在类中声明的顺序有关,与初始化列表中列出的变量的顺序无关
#include<iostream>
using namespace std;
class text {
int b, a;
public:
text():a(10),b(a+10) {}
void print();
} ;
void text::print() {
cout<<a<<endl<<b;
}
int main() {
text t;
t.print();
return 0;
}
输出结果b不是20,多半是10
最后,
析构函数会按照类的继承顺序从基类到派生类的顺序依次调用。
析构函数会按照创建对象的顺序从最后创建的对象到最先创建的对象的顺序依次调用。
析构函数会按照对象内部成员变量的声明顺序从最后声明的成员变量到最先声明的成员变量的顺序依次调用。
#include <iostream>
using namespace std;
class Books {
int id;
string name;
public:
Books(int i, string n): id(i), name(n) {
cout<<"Reading is important thing.\n";
}
~Books() {
cout<<"Destroy "<<name<<".\n";
}
void setId(int i) {
id = i;
}
int getId() {
return id;
}
void showId() {
cout<<"id is "<<id<<".\n";
}
void showName() {
cout<<"This book's name is "<<name<<".\n";
}
void show() {
showId();
showName();
}
};
int main() {
Books bo(123, "HandsomeTom");
bo.show();
Books ao(455656, "HI");
ao.show();
return 0;
}