构造函数

来源:互联网 发布:淘宝网黄金首饰 编辑:程序博客网 时间:2024/06/06 01:30

---------------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了一个默认值20name也给默认值

//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");

return0;

}

  

  

  

  

  

  

  

  

【made by siwuxie095】

0 0