本篇主要介绍C++ 中的构造函数。

构造函数,就是一个函数名与类名完全相同且没有返回值(连void也没有)的函数。

class 类名 {
	类名(行参表) {// 构造函数
		// 构造函数体
	}
};
  • 如果一个类中没有提供构造函数,那么系统会自动提供一个缺省的无参构造函数,一旦在类中定义过构造函数,那么系统不再提供缺省构造函数,此时可以通过构造函数重载来解决问题。

  • 当一个对象被创建时,系统会自动调用构造函数来初始化当前对象

  • 无参构造函数并不是指构造函数中必须没有参数(可以有参数,但需要有缺省值),而是指可以以无参的形式去调用(当然,是系统自动调用)

/*
    构造函数的使用.cpp
*/
#include <iostream>
#include <string>

using namespace std;

class Student {
private:
    string m_name;//姓名
    int m_age;//年龄
public:
    //定义一个有参构造函数
    Student(const string &name,int age) {
        m_name = name;
        m_age = age;
    }
    //定义一个无参构造函数,构成重载
    Student(void) {
        m_name = "无名氏";
        m_age = 0;
    }
    //展示自我并学习的行为
    void learn(const string &lesson) {
        cout << "我是" << m_name << ",今年" << m_age << "岁,正在学习" << lesson << endl;
    }
};

int main(void) {
    //Student s1 = {"张飞",30};错误
    //s1.m_name = "张飞";错误
    Student s1("张飞",30);//隐式创建对象
    s1.learn("C++");
    Student s2 = Student("关羽",35);//显式创建对象
    s2.learn("java");
    cout << "---------- 相当牛逼的分割线 ----------" << endl;
    Student ss[3] = {Student("赵云",28),Student("黄忠",50),Student("马超",25)};
    ss[0].learn("嵌入式");
    ss[1].learn(".Net");
    ss[2].learn("网络工程");
    cout << "---------- 相当牛逼的分割线 ----------" << endl;
    //堆区实例化对象
    Student *ps = new Student("刘备",40);
    ps->learn("PHP");
    delete ps;
    ps = NULL;
    cout << "---------- 相当牛逼的分割线 ----------" << endl;
    //在堆区定义数组
    ps = new Student[2];
    ps[0].learn("iOS");//ps[0] => *(ps + 0)
    delete[] ps;
    ps = NULL;
    cout << "---------- 相当牛逼的分割线 ----------" << endl;
    //Student s3();报错,这里相当于一个函数声明
    //s3.learn("Android");
    Student *ps3 = new Student();
    //Student *ps3 = new Student;也可以,效果一样
    ps3->learn("Android");
    return 0;
}
/* 输出结果:
我是张飞,今年30岁,正在学习C++
我是关羽,今年35岁,正在学习java
---------- 相当牛逼的分割线 ----------
我是赵云,今年28岁,正在学习嵌入式
我是黄忠,今年50岁,正在学习.Net
我是马超,今年25岁,正在学习网络工程
---------- 相当牛逼的分割线 ----------
我是刘备,今年40岁,正在学习PHP
---------- 相当牛逼的分割线 ----------
我是无名氏,今年0岁,正在学习iOS
*/
/*
    观察和分析构造的流程.cpp
*/
#include <iostream>

using namespace std;

class A {
public:
    A(void) {
        cout << "A构造了" << endl;
    }
};

class B {
private:
    A m_a;
public:
    //类成员变量定义先于构造函数体的执行
    B(void) {
        cout << "B构造了" << endl;
    }
};

int main(void) {
    B b;
    return 0;
}