当创建一个对象时,往往需要做一些初始化工作,例如对数据成员赋值等。为了解决这个问题,C++提供了构造函数。

构造函数(Constructor)是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用(用户也不能调用),而是在创建对象时自动执行。构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。

一个构造函数的例子:

#include <iostream>
using namespace std;
class Student{
private:
char *name;
int age;
float score;
public:
//声明构造函数
Student(char *, int, float);
//声明普通成员函数
void say();
};
//定义构造函数
Student::Student(char *name1, int age1, float score1){
name = name1;
age = age1;
score = score1;
}
//定义普通成员函数
void Student::say(){
cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}
int main(){
//根据构造函数创建对象
Student stu("小明", , 90.5f); //传参形式类似于函数调用
stu.say();
return ;
}

在类中我们定义了一个构造函数 Student(),它的作用是给3个 private 属性的成员变量赋值。在 main 函数中,我们根据构造函数创建了一个对象 stu;因为构造函数有参数,所以创建对象时要相应地传入实参,形式类似于函数调用。

读者要注意:一旦在类中定义了构造函数,那么创建对象时一定会被执行;如果构造函数有参数,创建对象时就要传参。

另外,构造函数主要用来进行初始化,没有返回值(有返回值没有任何意义),这就意味着:

  • 不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;
  • 函数体中不能有 return 语句。

默认构造函数

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

一个类,必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管它是 public 属性的,还是 private、protected 属性的,编译器都不再自动生成。上面的 Student 类,只有一个构造函数,就是我们自己定义的。

构造函数的重载

和普通成员函数一样,构造函数是允许重载的。一个类可以提供多个构造函数,让用户在创建对象时进行选择,编译器会根据创建对象时传递的参数来确定调用哪一个构造函数。也就是说:

  • 只有一个构造函数会被执行;
  • 创建对象时提供的参数必须和其中的一个构造函数匹配,否则编译错误。
#include <iostream>
using namespace std;
class Student{
private:
char *name;
int age;
float score;
public:
//声明构造函数
Student();
Student(char *, int, float);
//声明普通成员函数
void setname(char *);
void setage(int);
void setscore(float);
void say();
};
//定义构造函数
Student::Student(){}
Student::Student(char *name1, int age1, float score1){
name = name1;
age = age1;
score = score1;
}
//定义普通成员函数
void Student::setname(char *name1){
name = name1;
}
void Student::setage(int age1){
age = age1;
}
void Student::setscore(float score1){
score = score1;
}
void Student::say(){
cout<<name<<"的年龄是 "<<age<<",成绩是 "<<score<<endl;
}
int main(){
//创建对象时初始化成员变量
Student stu1("小明", , 90.5f);
stu1.say(); //调用成员函数来初始化成员变量的值
Student stu2;
stu2.setname("李磊");
stu2.setage();
stu2.setscore();
stu2.say();
return ;
}

类中定义了两个构造函数,一个带参数一个不带参数,它们是重载关系。当根据不带参数的构造函数创建对象时,不需要传参,成员变量不会被初始化,所以要调用成员函数来设置它们的值。

C++学习7 构造函数的更多相关文章

  1. 学习C++ -> 构造函数与析构函数

    学习C++ -> 构造函数与析构函数 一.构造函数的介绍    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用 ...

  2. 鸡啄米:C++编程之十四学习之构造函数和析构函数

    1. 本人学习鸡啄米课程的笔记记录,用来记录学习的历程和进度 2. 构造函数 我们在声明一个变量时,如果对它进行了初始化,那么在为此变量分配内存空间时还会向内存单元中写入变量的初始化.声明对象有相似的 ...

  3. c++学习笔记——构造函数

    构造函数定义:每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数. 需要注意的几点: 1:构造函数不能被声明为const的,当我们创 ...

  4. C++学习8 构造函数的参数初始化表

    构造函数是一种特殊的成员函数,在创建对象时自动执行,主要用来进行初始化工作,例如对 private 属性的成员变量赋值. 对成员变量的初始化,除了在构造函数的函数体中一一赋值,还可以采用参数初始化表. ...

  5. java学习面向对象构造函数

    在java当中目前我们学到的一个比较特殊的函数就是main函数,他是JVM执行的入口,所以书写的格式是固定的,现在我们来介绍java中另一个比较特殊的函数: 构造函数:构造对象的时候调用的函数,作用, ...

  6. JavaScript学习笔记-构造函数

    什么是构造函数 简单说构造函数是类函数,函数名与类名完全相同,且无返回值.构造函数是类的一个特殊成员函数. JavaScript构造函数 * 在JavaScript的世界里没有类的概念,JavaScr ...

  7. C++学习之构造函数和析构函数及指针

    C++的构造函数在创建对象时调用,分配内存空间,多少个对象(对象数组)就调用几次构造函数:析构函数在调用结束时调用(可以添加一些最后的处理)以释放内存给其它来用.对于同类型同生命期的对象,先创建的对象 ...

  8. JS学习笔记-构造函数篇

    创建实例 funtion Fn (){     var num = 10;         this.x = 100;     this.getX = function(){         cons ...

  9. C++学习之构造函数中的异常处理

    构造函数中可不可以抛出异常?当然可以.从语法上来说,是可以的:从实际情况来看,现在的软件系统日渐庞大和复杂,很难保证 Constructor 在执行过程中完全不发生一点异常. 那么,如果构造函数中抛出 ...

随机推荐

  1. Linux中的free命令

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  2. Oracle获取AWR和ASH

    -- 找到指定的snap select snap_id, max(sample_time) from sys.wrh$_active_session_history group by snap_id ...

  3. sql常用语句--转载

    一.基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 ...

  4. C#基础——Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

  5. Oracle常用知识小结

    前言: 前一段时间项目开发数据库环境为Oracle,作为一个SQLer,表示各种不适应.所以刚开始的时候走了一些弯路,浪费了一席时间.因此就想把这些常用的东西给总结一下,算是对自己学习的总结,也希望能 ...

  6. css字体文件

    ├── glyphicons-halflings-regular.eot├── glyphicons-halflings-regular.svg├── glyphicons-halflings-reg ...

  7. 本地同时启动两个tomcat

    本地同时启动两个tomcat 这几天开发用到了Ext JS4,所以着手学习Ext JS4,由于官方很多demo都是需要与服务器端进行数据交互,因此需要在tomcat里部署上官方的demo.而本地mye ...

  8. 股票自用指标 boll 菜刀

    BI:=(H+L+O+C)/; BOL:EMA(BI,N); UPPER:BOLL+N1*STD(CLOSE,N); LOWER:BOLL-N1*STD(CLOSE,N); MA1:MA(CLOSE, ...

  9. [转]String.getBytes()和new String()

    在Java中,String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如 byte[] b_gbk = "中&q ...

  10. Tortoise SVN Clean up失败的解决方法

    step1: 到 sqlite官网 (http://www.sqlite.org/download.html) 下载 sqlite3.exe (找到 Precompiled Binaries for ...