从放弃到重启 C++ —构造函数

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 在这个构造函数对属性 titlesubTitle 赋值。

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