构造函数

---------------siwuxie095

   

   

   

   

   

   

   

   

关于类和对象的思考:

   

1)实例化的对象是如何在内存中存储的?

2)类中的代码又是如何存储的?

(3)代码和数据又有怎样的关系?

   

   

   

   

   

对象结构

   

   

要想说清对象是如何存储的,必须先了解内存中按照用途被划分的 5 个区:

   

   

   

1)栈区

   

定义的变量存储在栈区,其特点为:内存由系统进行控制,无论是分配

还是回收,都不需要程序员来关心

   

   

2)堆区

   

如果分配内存时使用 new 运算符,则 new 出的内存存储在堆区,未来

必须使用 delete 来回收

   

3)全局区

   

存储全局变量和静态变量

   

   

4)常量区

   

存储字符串和常量

   

   

5)代码区

   

存储编译之后的二进制代码

   

   

   

如:定义一个汽车类

   

   

   

在该类被实例化之前,不会占用栈 或堆中内存,但当它实例化之后,

每个对象都会在栈上开辟出一段内存,用来存储各自的数据,它们是

不同的变量,占据着不同的内存,而逻辑代码只编译出了一份,放在

代码区,代码区中的代码供所有的对象使用,谁需要它就去调用它,

找到相应的代码入口即可

   

   

   

注意:

   

当实例化 3 个对象后,每个对象中的数据都是不可控的,都是未知的,

因为没有对这些数据进行初始化

   

   

   

如果没有初始化,就无法对这些数据进行预想的逻辑操作,

显然,必须对数据进行初始化

   

   

   

   

对象初始化

   

   

如:坦克大战中坦克出现位置的初始化

   

   

   

   

对于对象的初始化来说,不同的场合,有些只需要初始化一次,有些则要

根据条件初始化多次

   

   

   

   

初始化函数如何避免误操作而给程序带来的可能的灭顶之灾

   

   

   

   

为了帮助程序员避开这些风险,C++ 推出了构造函数:

   

   

   

   

1)构造函数最大的特点 在对象实例化时被自动调用,通常只需要将

初始化的代码写在构造函数内,就能起到初始化数据的作用了。需要强调

的是,构造函数在实例化对象时被调用且仅被调用一次

   

2)定义构造函数时,构造函数的名字要和类名同名

   

3)构造函数也没有返回值

   

4)构造函数可以进行重载

   

5)实例化对象时,即便有多个构造函数,也仅用到其中一个构造函数

   

(6)当用户没有定义构造函数时,编译器将自动生成一个构造函数,

其中没有做任何的事情,为空

   

   

   

如:无参构造函数

   

   

   

   

再如:有参构造函数

   

   

   

   

再如:重载构造函数

   

   

   

   

   

程序:

   

Teacher.h:

   

#include <string>

using namespace std;

   

   

class Teacher

{

public:

//无参构造函数

Teacher();

//有参构造函数,这里给age了一个默认值20 name也给默认值

//t1在实例化时就不知道该调用哪个构造函数,就不能通过编译

Teacher(string name, int age = 20);

void setName(string name);

string getName();

void setAge(int age);

int getAge();

private:

string m_strName;

int m_iAge;

};

   

   

   

Teacher.cpp:

   

#include "Teacher.h"

#include <iostream>

using namespace std;

   

Teacher::Teacher()

{

m_strName = "Jim";

m_iAge = 5;

cout << "Teacher()" << endl;

}

   

Teacher::Teacher(string name, int age)

{

m_strName = name;

m_iAge = age;

cout << "Teacher(string name, int age)" << endl;

}

   

void Teacher::setName(string name)

{

m_strName = name;

}

   

string Teacher::getName()

{

return m_strName;

}

   

void Teacher::setAge(int age)

{

m_iAge = age;

}

   

int Teacher::getAge()

{

return m_iAge;

}

   

   

   

main.cpp:

   

#include<stdlib.h>

#include "Teacher.h"

#include<iostream>

#include <string>

using namespace std;

   

   

int main(void)

{

Teacher t1;

Teacher t2("Merry", 15);

Teacher t3("James");

cout << t1.getName() << " " << t1.getAge() << endl;

cout << t2.getName() << " " << t2.getAge() << endl;

cout << t3.getName() << " " << t3.getAge() << endl;

system("pause");

return 0;

}

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6791947.html