zoukankan      html  css  js  c++  java
  • C++ 构造函数_内存分区_对象初始化

    内存分区

    栈区: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;
    }

    运行结果:

  • 相关阅读:
    Java应用程序的运行机制,以及JDK,JRE,JVM
    正则表达式练习题
    正则表达式
    转:DOM操作
    jQuery 遍历
    转:把一个对象赋值给另一个对象会指向同一个内存地址
    sql 语句的先后执行顺序
    数据结构时间复杂度进阶篇
    数据结构时间复杂度基础篇
    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现(转)
  • 原文地址:https://www.cnblogs.com/chuijingjing/p/9250464.html
Copyright © 2011-2022 走看看