C++中的类这个概念里有4个函数比较特殊,像我这种以前有C经验的人可能一时难以适应,它们是构造函数、析构函数、复制构造函数和赋值操作符。
1、为什么需要一个构造函数?
2、为什么有些数据要私有,有些又是公有,方法也是一样?
public修饰的数据和方法是可以让任何人访问的,如果你需要控制访问这些数据或者是某些方法,那么最好使用域修饰符public、protect、private来限制。在《C++沉思录》里有一段不错的描述,说明了我们对私有变量的访问可以有一些不同于一般做法的地方,举个例子,比如对一个私有变量的读取,一般都会写一个函数来返回这个私有变量,但是你想过还有别的方法没,比如我下面实现的使用一个const的引用来读:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/*
一个例子,说明为什么不使用一个绑定来代替getLength()函数
const引用确实能够实现目的,但是必须在每个构造函数的初始化表里增加一句
略显麻烦
*/
class
Stick {
public
:
const
int
&length;
// 一个const的引用,能够读取但无法修改
Stick(): true_length(1), length(true_length) {}
Stick(Stick &st): true_length(st.true_length), length(true_length) {}
Stick(
int
a): true_length(a), length(true_length) {}
void
setLength(
int
b) { true_length = b; }
// int getLength() { return true_length; }
private
:
int
true_length;
};
|
3、为什么需要一个无参的构造函数?
4、是否在构造函数中需要初始化所有的数据成员?
5、类需要析构函数吗?
6、类需要一个虚析构函数吗?
这个问题在我写笔记的时候还是犹豫了一下,原因在于我对虚函数的理解还是不够深刻。首先虚函数的作用只有在继承的时候才会体现,所以当一个类有可能成为父类的时候,虚函数才有作用,所以,如果你的类如果需要一个虚函数,那么首先这个类肯定会成为父类,否则你就是白写的。那么一个虚析构函数的作用是什么呢?书里没有讲,只给出了例子,我们先看例子吧。
假设有一个父类B,子类D继承自父类B,然后使用了一个父类的指针来析构子类,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class
B {
public
:
int
s;
};
class
D:
public
B {
public
:
int
t;
~D() {
printf
(
"~D\n"
); }
};
int
_tmain(
int
argc, _TCHAR* argv[])
{
B *bp =
new
D;
delete
bp;
return
0;
}
|
1
2
3
4
5
6
7
|
class
String {
public
:
String();
String(
const
char
*s);
private
:
char
*data;
};
|
1
2
3
4
5
6
7
8
|
class
String {
public
:
......
private
:
String(
const
String &);
String &operator=(
const
String &);
......
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
A {
public
:
A() {}
~A() {}
A(
const
A &) {
printf
(
"copy construct\n"
); }
A &operator=(
const
A &) {
printf
(
" = operator\n"
);
return
*
this
; }
};
int
_tmain(
int
argc, _TCHAR* argv[])
{
A a;
A b(a);
A c = a;
A d;
d = a;
return
0;
}
|