C++构造函数详解
创始人
2025-05-31 13:09:32
0

在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。

我们通过成员函数 setname()、setage()、setscore() 分别为成员变量 name、age、score 赋值,这样做虽然有效,但显得有点麻烦。有了构造函数,我们就可以简化这项工作,在创建对象的同时为成员变量赋值,请看下面的代码(示例1):

#include
usingnamespace std;class Student{
private:
char*m_name;
int m_age;
float m_score;
public:
//声明构造函数
Student(char*name,int age,float score);
//声明普通成员函数
voidshow();
};//定义构造函数
Student::Student(char*name,int age,float score){m_name = name;m_age = age;m_score = score;
}
//定义普通成员函数
void Student::show(){cout<show();return0;
}

运行结果:

小明的年龄是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
usingnamespace std;class Student{
private:
char*m_name;
int m_age;
float m_score;
public:
Student();
Student(char*name,int age,float score);
voidsetname(char*name);
voidsetage(int age);
voidsetscore(float score);
voidshow();
};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(char*name){m_name = name;
}
void Student::setage(int age){m_age = age;
}
void Student::setscore(float score){m_score = score;
}
void Student::show(){
if(m_name == NULL || m_age <=0){cout<<"成员变量还未初始化"<show();pstu ->setname("李华");pstu ->setage(16);pstu ->setscore(96);pstu ->show();return0;
}

运行结果:

小明的年龄是15,成绩是92.5

成员变量还未初始化

李华的年龄是16,成绩是96

构造函数Student(char *, int, float)为各个成员变量赋值,构造函数Student()将各个成员变量的值设置为空,它们是重载关系。根据Student()创建对象时不会赋予成员变量有效值,所以还要调用成员函数 setname()、setage()、setscore() 来给它们重新赋值。

构造函数在实际开发中会大量使用,它往往用来做一些初始化工作,例如对成员变量赋值、预先打开文件等。

默认构造函数

如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有形参,也不执行任何操作。比如上面的 Student 类,默认生成的构造函数如下:

Student(){}

一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成。在示例1中,Student 类已经有了一个构造函数Student(char *, int, float),也就是我们自己定义的,编译器不会再额外添加构造函数Student(),在示例2中我们才手动添加了该构造函数。

实际上编译器只有在必要的时候才会生成默认构造函数,而且它的函数体一般不为空。默认构造函数的目的是帮助编译器做初始化工作,而不是帮助程序员。这是C++的内部实现机制,这里不再深究,初学者可以按照上面说的“一定有一个空函数体的默认构造函数”来理解。

最后需要注意的一点是,调用没有参数的构造函数也可以省略括号。对于示例2的代码,在栈上创建对象可以写作Student stu()或Student stu,在堆上创建对象可以写作Student *pstu = new Student()或Student *pstu = new Student,它们都会调用构造函数 Student()。

以前我们就是这样做的,创建对象时都没有写括号,其实是调用了默认的构造函数。

相关内容

热门资讯

清静的反义词   一、【反义词】  喧嚣、嘈杂、吵杂、烦扰、烦嚣  二、【基本解释】  [释义](形)(环境)安静...
毫无疑义的近义词及意思 毫无疑义的近义词及意思毫无疑义近义词: 不容置疑( 注释:不允许有什么怀疑。表示论证严密,无可怀疑。...
贯通的近义词是什么   新知识会以新颖、或许奇妙的方式与旧知识融会贯通。下面是小编收集整理的贯通的近义词,希望对您有所帮...
乔太守乱点鸳鸯谱的近义词 乔太守乱点鸳鸯谱的近义词有:乱点鸳鸯谱,乔太守乱点鸳鸯谱[qiáo tài shǒu luàn di...
移动应用架构设计:如何转变开发... 移动应用架构设计:如何转变开发流程 2023 年掌握移动应用程序架构的指南࿰...
计算机组成原理实验1---运算...     本实验为哈尔滨工业大学计算机组成原理实验,实验内容均为个人完成,...
八面威风的近义词及意思 八面威风的近义词及意思八面威风近义词: 八面威风( 注释:威风:令人敬畏的'气势。各个方面都很威风。...
英雄无用武之地的近义词 英雄无用武之地的近义词有:怀才不遇,英雄无用武之地[yīng xióng wú yòng wǔ zh...
弃文就武的近义词 弃文就武的近义词有:弃文竞武,弃笔从戎,投笔从戎,弃文就武[qì wén jiù wǔ]的意思:放弃...
徒拥其名的近义词 徒拥其名的近义词有:徒拥虚名,徒有虚名,徒拥其名[tú yōng qí míng]的意思:徒:只。空...
Blender教程利用Cell...   推荐:将 NSDT场景编辑器 加入你的3D开发工具链 效果图 一、Cell F...
项目经理的这些致命错误,你有吗... 由于公司因业务发展,需要提拔一批项目经理。 王波就是其中之一,是一名技...
神思恍惚的近义词 神思恍惚的近义词有:神情恍惚,神魂颠倒,若有所思,神思恍惚[shén sī huǎng hū]的意思...
超以象外的近义词 超以象外的近义词有:超然象外,超以象外[chāo yǐ xiàng wài]的意思:以:用法等同“于...
Python进阶之多态和属性访... 面向对象三大特征 封装:将数据和方法放在一个类中,构成封装。继承...
父母国的近义词 父母国的近义词有:父母之国,父母之邦,父母国[fù mǔ guó]的意思:指祖国出自:战国·邹·孟轲...
徘徊的近义词 徘徊的近义词  徘徊  【拼音】:pái huáiimage  【释义】:往返回旋;来回走动。比喻事...
【免费分享】全球海洋测深DEM... (本文首发于“水经注GIS”公号,订阅“水经注GIS”公号,...
Airwallex 基于 Fl... 摘要:本文整理自 Airwallex Risk ML Platform Team 董大...
回黄转绿的近义词 回黄转绿的近义词有:大地回春,回黄转绿[huí huáng zhuǎn lǜ]的意思:树叶由绿变黄,...