构造函数
当类的实例进入作用域时,即对象被建立,则就会调用构造函数。构造函数的作用是:建立一个对象时,构造函数可以对这个对象进行初始化。
构造函数特点
- 构造函数名和类名相同。
- 构造函数没有返回值。
- 构造函数可以在类内和类外定义。
- 构造函数可以重载。
- 构造函数在对象被创建时自动调用。
构造函数语法
- 成员初始化列表,格式为:类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表)…{类的初始化}
// PERSON.h文件
#pragma once
class PERSON
{
public:
short Age;
char* Name;
PERSON(short Age , char *Name);
};
// PERSON。cpp文件
PERSON::PERSON(short age , char* name):
Age(age),Name(name){
}
// main.cpp 文件
#include <iostream>
#include "PERSON.h"
int main()
{
char p1_name[] = "ponytail";
PERSON p1(20, p1_name);
std::cout << p1.Name << std::endl;
std::cout << p1.Age << std::endl;
return 0;
}
- 赋值方式,格式为:类名::类名(形参表){类的初始化}
// PERSON.h文件
#pragma once
class PERSON
{
public:
short Age;
char* Name;
PERSON(short Age , char *Name);
};
// PERSON.cpp文件
#include "PERSON.h"
PERSON::PERSON(short age , char* name)
{
Age = age;
Name = name;
}
// main.cpp文件
#include <iostream>
#include "PERSON.h"
int main()
{
char p1_name[] = "ponytail";
PERSON p1(20, p1_name);
std::cout << p1.Name << std::endl;
std::cout << p1.Age << std::endl;
return 0;
}
- 两种写法的区别1:方法一应该叫作初始化,方法二应该叫作赋值。二者是有本质的区别的。C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。因此方法二的构造函数内属性不能算是被初始化,是被赋值了。初始化发生的时间更早,发生在这些成员的default构造函数被自动调用之时。使用方法二的构造函数需要执行两次copy构造。因此理论上使用方法一的成员初始化列表(member initialization list)方式的效率更高,因为比起先调用default构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数是比较高效的。
赋值构造函数
当需要保存对象的副本,以便在后面执行过程中恢复对象的原始状态,则可以使用复制构造函数实现。复制构造函数就是函数的参数是一个已经初始化的类对象。因为比较简单,直接上示例:
// PERSON.h 文件
#pragma once
class PERSON
{
public:
short Age;
char* Name;
PERSON(short Age , char *Name);
PERSON(PERSON& copyPERSON);
};
// PERSON.cpp 文件
#include "PERSON.h"
PERSON::PERSON(short age , char* name)
{
Age = age;
Name = name;
}
PERSON::PERSON(PERSON& copyPERSON)
{
Age = copyPERSON.Age;
Name = copyPERSON.Name;
}
// main.cpp 文件
#include <iostream>
#include "PERSON.h"
int main()
{
char p1_name[] = "ponytail";
PERSON p1(20, p1_name);
PERSON p1_back(p1);
std::cout << p1.Name << std::endl;
std::cout << p1.Age << std::endl;
std::cout << p1_back.Name << std::endl;
std::cout << p1_back.Age << std::endl;
p1.Age = 25 ;
std::cout << p1.Name << std::endl;
std::cout << p1.Age << std::endl;
return 0;
}
节选自《Effective C++》 ↩︎