3.0概要
学习目的:
- 学习构造析构函数
- 完成对象数据成员的初始化和清理工作
- 掌握对象的构造与构析方法
课程内容:
- 普通构造函数
- 拷贝构造函数
- 析构函数
重点难点:
- 构造函数
- 拷贝构造函数
3.1普通构造函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class MyClass {
public:
int num;
void setVal(int v);
int getVal(); //用来得到val的值
private:
int val;
};
void MyClass::setVal(int v) {
val = v;
}
int MyClass::getVal() {
return val;
}
int main() {
MyClass obj; //创建一个对象
obj.num = 0;
cout << obj.num << endl;
obj.setVal(10);
cout << obj.getVal() << endl;
return 0;
}
构造函数是一种特殊的成员函数。主要用来在 创建对象时初始化对象。为对象的成员变量赋初始值。
-
构造函数名和类名相同。
-
构造函数没有返回值类型,也没有返回值。(没有返回值类型不是指void,void也是一种返回值类型)
-
构造函数可以重载 ,需要满足函数重载的条件。
class MyClass {
public:
int num;
private:
int val;
public:
MyClass() { //构造函数
cout << "MyClass()" << endl;
}
MyClass(int n, int v); //构造函数是可以重载的,所以这里给了参数
void setVal(int v);
int getVal();
};
void MyClass::setVal(int v) {
val = v;
}
int MyClass::getVal() {
return val;
}
MyClass::MyClass(int n, int v) { //构造函数
cout << "MyClass(int n,int v)" << endl;
num = n;
val = v;
}
int main() {
MyClass obj;//创建一个对象
obj.num = 0;
cout << obj.num << endl;
obj.setVal(10);
cout << obj.getVal() << endl;
return 0;
}
这里我们没有主动调用
MyClass() {
cout << "MyClass()" << endl;
}
但是输出的时候打印了MyClass(),说明系统会主动调用。这个构造函数在调用对象的时候就被系统主动调用了。
- 在创建一个新的对象时会自动调用。
- 如果一个类中没有显式的给出构造函数,系统会自动地给出一个构造函数。
class MyClass {
public:
int num;
private:
int val;
public:
MyClass() {
cout << "MyClass()" << endl;
}
MyClass(int n, int v);
void setVal(int v);
int getVal();
};
void MyClass::setVal(int v) {
val = v;
}
int MyClass::getVal() {
return val;
}
MyClass::MyClass(int n, int v) {
cout << "MyClass(int n,int v)" << endl;
num = n;
val = v;
}
int main() {
MyClass obj;//创建一个对象//调用了无参数的MyClass()
MyClass obj1(1,2);//调用了有参数的MyClass()
obj.num = 0;
cout << obj.num << endl;
obj.setVal(10);
cout << obj.getVal() << endl;
return 0;
}
C语言里面的const是将一个变量修改为只读,不能直接修改。
C++里面的const是直接将这个变量改变性质,成为一个常量。
class MyClass {
public:
const int id = 0;
public:
MyClass(){
}
};
int main() {
MyClass obj_0;
cout << obj_0.id << endl;
MyClass obj_1;
cout << obj_1.id << endl;
return 0;
}
输出:
0
0
有时数据成员必须初始化,不能在构造函数中赋值----用成员初始化列表的方式给数据成员赋值
class MyClass {
public:
const int id;
public:
MyClass(int i):id(i){ //值从int i传进来,同时赋值给id(i)
}
};
class MyClass {
public:
const int id;
const int num;
const int val;
public:
MyClass(int i, int n) :id(i), num(n), val(0) {
}
};
为什么这里的构造函数MyClass()里面只有两个参数呢?
在 C++ 中,如果一个类的成员变量是const
的,那么它必须在构造函数的初始化列表中被初始化,因为const
成员变量不能在构造函数体内被赋值。如果一个const
成员变量在初始化列表中没有被初始化,那么编译器将会报错。
在代码中,val
成员变量没有在初始化列表中被初始化,所以编译器会报错。为了修复这个问题,您需要在构造函数的初始化列表中为val
提供一个值。
class MyClass {
public:
const int id;
const int num;
const int val;
public:
MyClass(int i, int n);
};
MyClass::MyClass(int i, int n) :id(i), num(n), val(0) {
}
错。为了修复这个问题,您需要在构造函数的初始化列表中为val
提供一个值。
class MyClass {
public:
const int id;
const int num;
const int val;
public:
MyClass(int i, int n);
};
MyClass::MyClass(int i, int n) :id(i), num(n), val(0) {
}