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;
}