关于构造函数的总结

构造函数

当类的实例进入作用域时,即对象被建立,则就会调用构造函数。构造函数的作用是:建立一个对象时,构造函数可以对这个对象进行初始化。

构造函数特点

  1. 构造函数名和类名相同。
  2. 构造函数没有返回值。
  3. 构造函数可以在类内和类外定义。
  4. 构造函数可以重载。
  5. 构造函数在对象被创建时自动调用。

构造函数语法

  1. 成员初始化列表,格式为:类名::类名(形参表):内嵌对象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;
}
  1. 赋值方式,格式为:类名::类名(形参表){类的初始化}
// 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. 两种写法的区别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;
}

  1. 节选自《Effective C++》 ↩︎

猜你喜欢

转载自blog.csdn.net/qq_45279570/article/details/109724093