持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
构造函数
对象的初始化方法需要在程序规定好,c++ 语法提供了一个特殊的机制—构造函数
int a = 0;
int b(2)
- 构造函数名称与类名称相同
- 构造函数是没有返回值
- 构造函数中没有
return - 在没有创建构造函数,编译器会默认创建一个为空的构造函数
- 可以内联函数
- 可以重载
- 可以带默认参数值
构造函数的调用时机
- 对象创建时自动调用
Tut tut("machine learning","object detection");
隐含生成的构造函数
- 参数列表为空,不为数据成员设置初始值
- 如果类内定义了成员的初始值,则使用类内定义的初始值
- 如果没有定义类内的初始值,则以默认方式初始化
- 基本类型的数据默认初始化值是不确定的
#include<iostream>
class Tut{};
int main()
{
Tut tut1;
return 0;
}
这里定义类 Tut 在函数体中没有定义构造函数,这编译器在 Tut tut1 在定义 Tut 类型的变量会创建一个构造函数。
class Tut
{
public :
string title;
string subTitle;
string get_title() const { return title; };
Tut(string title, string subTitle) : title(title), subTitle(subTitle) {}
};
这样可以定义构造函数 Tut 在这个构造函数对属性 title 和 subTitle 赋值。
Tut tut1 = Tut("machine learning","object detection");
Tut tut2;
一旦创建了一个带有参数构造函数,这是如果创建一个构造函数,这是编译器就不会再去创建一个空构造函数,所以当再次 Tut tut2 就会抛出一个错误。这时我们有两种解决方案
- 手动创建一个空的构造函数
Tut() {};
Tut(string title, string subTitle) : title(title), subTitle(subTitle) {}
- 通过
Tut() = default;这种形式来构建默认构造函数,这样做好处是只有在用户创建空对象时,编译器才会创建这个Tut(){}这个空构造函数。
getter 和 setter
在这篇分享中,会解释为什么要使用 getter 和 setter ,有关 getter 和 setter 自己认识也非常有限,如果有遗漏和出入的地方还希望大家多多指正批评。
#include<iostream>
using namespace std;
class Tut
{
public :
string get_title() const { return m_title; };
string get_subTitle()const { return m_subTitle; };
void set_title(string title) { m_title = title; };
void set_subTitle(string subTitle) { m_subTitle = subTitle; };
Tut() = default;
Tut(string title, string subTitle) : m_title(title), m_subTitle(subTitle) {}
private:
string m_title;
string m_subTitle;
};
string get_title() const { return m_title; }; 在 get_title() 后面跟着 const 表示不允许修改返回值。
void getPresentation(const Tut& tut)
{
cout << "title: " << tut.get_title() << endl;
cout << "subtitle: " << tut.get_subTitle() << endl;
}