C++ class 和 struct 构造函数

1)、 Class

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

和普通成员函数一样,构造函数是允许重载的。一个类可以有多个重载的构造函数,创建对象时根据传递的实参来判断调用哪一个构造函数。

构造函数没有返回值,因为没有变量来接收返回值,即使有也毫无用处,这意味着:不管是声明还是定义,函数名前面都不能出现返回值类型,即使是 void 也不允许;函数体中不能有 return 语句。

构造函数的调用是强制性的,一旦在类中定义了构造函数,那么创建对象时就一定要调用,不调用是错误的。如果有多个重载的构造函数,那么创建对象时提供的实参必须和其中的一个构造函数匹配;反过来说,创建对象时只有一个构造函数会被调用。

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

一个类必须有构造函数,要么用户自己定义,要么编译器自动生成。一旦用户自己定义了构造函数,不管有几个,也不管形参如何,编译器都不再自动生成

class Student{
private:
    int _age;
    string _name;
public:
//定义了两种构造函数。
    Student():_age(0),_name(""){}
    Student(int age, string name):_age(age), _name(name){}
};
 
最后需要注意的一点是,调用没有参数的构造函数也可以省略括号。
Student stu; 或者 Student stu();

在栈上创建对象可以写作Student stu()或Student stu,
在堆上创建对象可以写作Student *pstu = new Student()或Student *pstu = new Student
它们都会调用构造函数 Student()。

2)、struct

在c++ 中,和class 一样,如果在struct 内部有构造函数后,就不再有默认的构造函数。采用初始化列表的方法。

struct node{
    int a;
    int b;
    node(int ma, int mb):a(ma), b(mb){}
};

int main()
{
    node node1;//会报错,说不存在默认的构造函数,因此,需要加上没参数的构造函数。
    retrun 0;
}


struct node{
    int a;
    int b;
    node(){}
    node(int ma, int mb):a(ma), b(mb){}
}N[2];
在建立结构体数组时,如果只写了带参数的构造函数将会出现数组无法初始化的错误。

3)、两者不同

C++中的 struct 和 class 基本是通用的,唯有几个细节不同:

  • 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。
  • class 继承默认是 private 继承,而 struct 继承默认是 public 继承。
  • class 可以使用模板,而 struct 不能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值