一.内存分区
1.内存简单分配
栈区:一个特点就是内存有系统来进行控制,无论是分配还是来进行回收都不需要程序员来关心。
堆区:需要程序员来申请和回收。
2.对象中数据的存储
对象在实例化之前是不会占用内存的,但是实例化之后就会在栈中开辟出一段内存,用来存储各自的数据。实例化后不同的对象是不同的变量,占据着不同的内存。
但是注意,逻辑代码只编译出了一份放在代码区,当需要的时候代码区的代码供所有的代码使用。
3.对象的初始化
举一个简单的例子:
对象初始化的分类:
为了避免初始化函数的误操作,比如忘记调用初始化函数和重复调用初始化函数,这都将给我们的程序造成灭顶之灾,于是就出现了构造函数。
二.构造函数
1.构造函数的规则和特点:
构造函数在对象实例化时会被自动调用,且仅被调用一次。
构造函数与类同名。
构造函数没有返回值(连void也不用写)。
构造函数可以有多个重载形式。
实例化对象时仅用到一个构造函数。
当用户没有定义构造函数时,编译器会自动生成一个构造函数(但是这个构造函数没有做任何事情)
2.构造函数的定义
a.无参构造函数
b.有参构造函数
3.构造函数的重载
构造函数的重载比较简单只需要遵循重载的规则就好了。
下面我们就举一个例子,使用分文件类外定义的方法,这也是最好的方式。
main函数文件:
#include<iostream>
#include<stdlib.h>
#include<string>
#include"teacher.h"
using namespace std;
/****************************************************************/
/*自定义有参和无参构造函数
*数据成员:
* 名字
* 年龄
*成员函数
* 数据成员的封装函数
/****************************************************************/
int main(void)
{
Teacher t1;
Teacher t2("Merry",15);
cout << t1.getName() << " " << t1.getAge() << endl;
cout << t2.getName() << " " << t2.getAge() << endl;
system("pause");
return 0;
}
Teacher.h文件
#include<string>
using namespace std;
class Teacher
{
public:
Teacher();
Teacher(string _name, int _age);
void setName(string _name);
string getName();
void setAge(int _age);
int getAge();
public:
string m_strName;
int m_iAge;
};
Teacher.cpp文件
#include<iostream>
#include<stdlib.h>
#include<string>
#include "Teacher.h"
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;
}