[c++]类的构造函数

构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。(摘自百度百科 构造函数 )
In class-based object-oriented programming, a constructor (abbreviation: ctor) in a class is a special type of subroutine called to create an object. It prepares the new object for use, often accepting arguments that the constructor uses to set required member variables. (from wikipedia)

1、最基本的构造函数

构造函数的执行过程:

1)传参 2)给类数据成员开辟空间 3)执行冒号语法给数据成员初始化 4)执行构造函数括号里面的内容

class student{
// 重载构造函数,使得类有初始化。
public:
    student() : name("0"), score(0) {};
    student(string s, int n) : name(s), score(n) {};
private:
    string name;
    int score;
};
int main() {
    student stu;
    stu.print();
    return 0;
}

2、拷贝构造函数

class student{
public:
    student() : name("0"), score(0) {};
    student(string s, int n) : name(s), score(n) {};
    student(student& cpy) : name(cpy.name), score(cpy.score) {};
    void print() {
        cout << name << score << endl;
    }

private:
    string name;
    int score;
};

int main() {
    student stu("su", 100);
    stu.print();
    student stu1(stu);
    stu1.print();
    return 0;
}

为什么拷贝构造函数的参数只能用引用呢?

这就要从拷贝构造函数式数码时候触发开始说起了,以下几种情况都会自动调用拷贝构造函数:

1)用一个已有的对象初始化一个新对象的时候

2)将一个对象以值传递的方式传给形参的时候

3)函数返回一个对象的时候

所以当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。(摘自百度百科 拷贝构造函数 )。

拷贝构造函数,一般不需要自己编写,系统默认的拷贝构造函数就能抗住了,但是有些情况需要在构造的时候开辟空间,这时候就需要拷贝构造函数了,如下代码是摘自 林锐 博士的 高质量C++编程指南 一文。

 1 class String 
 2 {
 3 public:
 4     String(const char *str = NULL); // 普通构造函数
 5     String(const String &other);    // 拷贝构造函数
 6     ~ String(void);                 // 析构函数
 7 private:
 8     char *m_data; // 用于保存字符串
 9 };
10 // String 的析构函数
11 String::~String(void) 
12 {
13     delete [] m_data;
14     // 由于m_data 是内部数据类型,也可以写成 delete m_data;
15 }
16 
17 // String 的普通构造函数
18 String::String(const char *str) 
19 {
20     if(str==NULL)
21     {
22         m_data = new char[1]; // 若能加 NULL 判断则更好
23         *m_data = '\0';
24     }
25     else
26     {
27         int length = strlen(str);
28         m_data = new char[length+1]; // 若能加 NULL 判断则更好
29         strcpy(m_data, str);
30     }
31 }
32 // 拷贝构造函数
33 String::String(const String &other) 
34 {
35     int length = strlen(other.m_data);
36     m_data = new char[length+1]; // 若能加 NULL 判断则更好
37     strcpy(m_data, other.m_data);
38 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值