吹静静

欢迎QQ交流:592590682

内存分区

栈区:int  x = 0;int  *p = NULL;

  定义一个变量,定义一个指针时,会在栈区进行分配内存。分配的内存系统分配收回的,我们不用管。

堆区:int  *p = new  int[20];

  申请一块内存时,是在堆区进行的,用 new 申请,用 delete 删除,内存的调用需要程序员管理的。

全局区:储存全局变量及静态变量

常量区:string  str = "hello";

代码区:存储逻辑代码的二进制

例子:

首先,我们定义一个Car的类,在它被实例化之前,是不会占用堆或者栈中的内存的。

class Car
{
private:
    int wheelCount;
public:
    int getWheelCount()
    {return wheelCount;}
};

现在我们实例化出三个对象:

car1

  wheelCount

car2

  wheelCount

car3

  wheelCount

这时,每一个对象都会在栈中开辟一块内存,用于存储各自的数据

实例化对象后,会编译出一段代码:getWheelCount 放在代码区,供所有的对象使用。

实例化完成之后,接下来我们就要对对象初始化。

对象初始化

从图中我们可以看出,已经实例化出两个对象,t1,t2,当我们想要调用时,需要对其初始化,t1.init();就是调用了init()函数,里面对数据成员进行初始化。

构造函数的规则和特点

构造函数在对象实例化时被自动调用(有且仅有一次)

构造函数与类同名

构造函数没有返回值

构造函数可以有多个重载

实例化对象时仅用到一个构造函数

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

无参构造函数

class Student
{
public:
    Student(){m_strName = "cjj";}
private:
    string m_strName;
};

有参构造函数

class Student
{
public:
    Student(string name)
    {m_strName = name;}
private:
    string m_strName;
};

重载构造函数

class Student
{
public:
    Student(){m_strName = "cjj";}
    Student(string name)
    {m_strName = name;}
private:
    string m_strName;
};

代码实例:

demo.cpp

#include <iostream>
#include <stdlib.h>
#include <string>
#include "Teacher.h"
using namespace std;

/*************************************************************************
Teacher类
    自定义无参构造函数
    自定义有参构造函数

数据成员:
    姓名
    年龄

成员函数:
    数据成员的封装函数

*************************************************************************/

int main(void)
{
    Teacher t1; // 调用无参构造函数
    cout<<t1.getName()<<" "<<t1.getAge()<<endl;

    Teacher t2("狗蛋",12); // 调用有参构造函数
    cout<<t2.getName()<<" "<<t2.getAge()<<endl;

    Teacher t3("王八蛋"); // 调用有参构造函数
    cout<<t3.getName()<<" "<<t3.getAge()<<endl;
  system("pause");
  return 0;
}

 

Teacher.h

#include<string>
using namespace std;

class Teacher
{
public:
    // 声明构造函数
    Teacher(); // 无参构造函数
    Teacher(string name,int age = 88); // 有参构造函数,定义时直接加上默认值

    // 声明成员函数,把所有的成员函数都罗列出来
    void setName(string _name);
    string getName();
    void setGender(string _gender);
    string getGender();
    void setAge(int _age);
    int getAge();
    void teach();

private:
    string m_strName;
    string m_strGender;
    int m_iAge;    
};

声明构造函数时,我们时可以直接给有参构造函数赋默认值的。但是不能给所有的参数都加上默认值,否则,系统不知道调用有参构造函数还是无参构造函数。

例如:

下面这两个函数在一块时,调用的时候就会出现错误,他们两个只能出现一个

Teacher();
Teacher(string name = "cjj",int age = 88);

Teacher.cpp

#include"Teacher.h"
#include<iostream>
using namespace std;

// 定义无参构造函数
Teacher::Teacher()
{
    m_strName = "cjj";
    m_iAge = 22;
    cout<<"无参构造函数:Teacher::Teacher()"<<endl;
}
// 定义有参构造函数
Teacher::Teacher(string name,int age)
{
    m_strName = name;
    m_iAge = age;
    cout<<"有参构造函数:Teacher::Teacher()"<<endl;
}

// 类外定义,写出成员函数的函数体
void Teacher::setName(string _name)
{
    m_strName = _name;
}
string Teacher::getName()
{
    return m_strName;
}
void Teacher::setGender(string _gender)
{
    m_strGender = _gender;
}
string Teacher::getGender()
{
    return m_strGender;
}
void Teacher::setAge(int _age)
{
    m_iAge = _age;
}
int Teacher::getAge()
{
    return m_iAge;
}
void Teacher::teach()
{
    cout<<"现在上课!"<<endl;
}

运行结果:

 

posted on 2018-07-01 17:23  吹静静  阅读(480)  评论(0编辑  收藏  举报