Date
May. 20th, 2024
 
2024年 4月 13日

Post: C++ Primer 010 : 构造函数

C++ Primer 010 : 构造函数

Published 12:05 May 25, 2013.

Created by @ezra. Categorized in #Programming, and tagged as #C/C++.

Source format: Markdown

Table of Content

本篇主要介绍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;
}
Pinned Message
HOTODOGO
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF