无名 发表于 2022-5-8 18:55:11

C++构造函数(Constructor)

在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。在《C++类成员的访问权限》一节中,我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点麻烦。有了构造函数,我们就可以简化这项工作,在创建对象的同时为成员变量赋值,请看下面的代码(示例1):

#include

using namespace std;

class Student{

private:

char *m_name;

int m_age;

float m_score;

public:

//声明构造函数

Student(char *name, int age, float score);

//声明普通成员函数

void show();

};

//定义构造函数

Student::Student(char *name, int age, float score){

m_name = name;

m_age = age;

m_score = score;

}

//定义普通成员函数

void Student::show(){

cout show();

return 0;

}

运行结果:小明的年龄是15,成绩是92.5李华的年龄是16,成绩是96该例在 Student 类中定义了一个构造函数Student(char *, int, float),它的作用是给三个 private 属性的成员变量赋值。要想调用该构造函数,就得在创建对象的同时传递实参,并且实参由( )包围,和普通的函数调用非常类似。在栈上创建对象时,实参位于对象名后面,例如Student stu("小明", 15, 92.5f);在堆上创建对象时,实参位于类名后面,例如new Student("李华", 16, 96)。构造函数必须是 public 属性的,否则创建对象时无法调用。当然,设置为 private、protected 属性也不会报错,但是没有意义。构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,这意味着:

不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;

函数体中不能有 return 语句。

构造函数的重载

和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配;反过来说,创建对象时只有一个构造函数会被调用。对示例1中的代码,如果写作Student stu或者new Student就是错误的,因为类中包含了构造函数,而创建对象时却没有调用。更改示例1的代码,再添加一个构造函数(示例2):

#include

using namespace std;

class Student{

private:

char *m_name;

int m_age;

float m_score;

public:

Student();

Student(char *name, int age, float score);

void setname(char *name);

void setage(int age);

void setscore(float score);

void show();

};

Student::Student(){

m_name = NULL;

m_age = 0;

m_score = 0.0;

}

Student::Student(char *name, int age, float score){

m_name = name;

m_age = age;

m_score = score;

}

void Student::setname
http://cdn.u1.huluxia.com/g3/M03/D4/EB/wKgBOV2SlSeAK3F1AAALvMjQW7405.jpeg
页: [1]
查看完整版本: C++构造函数(Constructor)