内存分区

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

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

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

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

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

常量区:string  str = "hello";

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

例子:

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

  1. class Car
  2. {
  3. private:
  4. int wheelCount;
  5. public:
  6. int getWheelCount()
  7. {return wheelCount;}
  8. };

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

car1

  wheelCount

car2

  wheelCount

car3

  wheelCount

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

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

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

对象初始化

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

构造函数的规则和特点

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

构造函数与类同名

构造函数没有返回值

构造函数可以有多个重载

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

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

无参构造函数

  1. class Student
  2. {
  3. public:
  4. Student(){m_strName = "cjj";}
  5. private:
  6. string m_strName;
  7. };

有参构造函数

  1. class Student
  2. {
  3. public:
  4. Student(string name)
  5. {m_strName = name;}
  6. private:
  7. string m_strName;
  8. };

重载构造函数

  1. class Student
  2. {
  3. public:
  4. Student(){m_strName = "cjj";}
  5. Student(string name)
  6. {m_strName = name;}
  7. private:
  8. string m_strName;
  9. };

代码实例:

demo.cpp

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include "Teacher.h"
  5. using namespace std;
  6.  
  7. /*************************************************************************
  8. Teacher类
  9. 自定义无参构造函数
  10. 自定义有参构造函数
  11.  
  12. 数据成员:
  13. 姓名
  14. 年龄
  15.  
  16. 成员函数:
  17. 数据成员的封装函数
  18.  
  19. *************************************************************************/
  20.  
  21. int main(void)
  22. {
  23. Teacher t1; // 调用无参构造函数
  24. cout<<t1.getName()<<" "<<t1.getAge()<<endl;
  25.  
  26. Teacher t2("狗蛋",); // 调用有参构造函数
  27. cout<<t2.getName()<<" "<<t2.getAge()<<endl;
  1. Teacher t3("王八蛋"); // 调用有参构造函数
  2. cout<<t3.getName()<<" "<<t3.getAge()<<endl;
  1.   system("pause");
      return ;
    }

Teacher.h

  1. #include<string>
  2. using namespace std;
  3.  
  4. class Teacher
  5. {
  6. public:
  7. // 声明构造函数
  8. Teacher(); // 无参构造函数
  9. Teacher(string name,int age = 88); // 有参构造函数,定义时直接加上默认值
  10.  
  11. // 声明成员函数,把所有的成员函数都罗列出来
  12. void setName(string _name);
  13. string getName();
  14. void setGender(string _gender);
  15. string getGender();
  16. void setAge(int _age);
  17. int getAge();
  18. void teach();
  19.  
  20. private:
  21. string m_strName;
  22. string m_strGender;
  23. int m_iAge;
  24. };

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

例如:

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

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

Teacher.cpp

  1. #include"Teacher.h"
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. // 定义无参构造函数
  6. Teacher::Teacher()
  7. {
  8. m_strName = "cjj";
  9. m_iAge = ;
  10. cout<<"无参构造函数:Teacher::Teacher()"<<endl;
  11. }
  12. // 定义有参构造函数
  13. Teacher::Teacher(string name,int age)
  14. {
  15. m_strName = name;
  16. m_iAge = age;
  17. cout<<"有参构造函数:Teacher::Teacher()"<<endl;
  18. }
  19.  
  20. // 类外定义,写出成员函数的函数体
  21. void Teacher::setName(string _name)
  22. {
  23. m_strName = _name;
  24. }
  25. string Teacher::getName()
  26. {
  27. return m_strName;
  28. }
  29. void Teacher::setGender(string _gender)
  30. {
  31. m_strGender = _gender;
  32. }
  33. string Teacher::getGender()
  34. {
  35. return m_strGender;
  36. }
  37. void Teacher::setAge(int _age)
  38. {
  39. m_iAge = _age;
  40. }
  41. int Teacher::getAge()
  42. {
  43. return m_iAge;
  44. }
  45. void Teacher::teach()
  46. {
  47. cout<<"现在上课!"<<endl;
  48. }

运行结果:

C++ 构造函数_内存分区_对象初始化的更多相关文章

  1. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  2. 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写

    #define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...

  3. 操作系统(5)_内存管理_李善平ppt

    i386先通过段是管理,在通过页是管理

  4. C#基础(204)--对象初始化器,基本数据类型与引用数据类型特点总结,ref,out关键字的使用

    对象初始化器: 对象在创建过程中也可以使用对象初始化器完成“属性的初始化” Student stu =new Student(){ StudentId=, StudentName="张三&q ...

  5. C#对象初始化器

    1.对象初始化器 Student objStu2 = new Student() { StudentId=, //属性之间使用","分隔 StudentName="小明& ...

  6. 1. js数据类型_对象_函数_内存

    1. js数据类型有哪些? 基本(值)类型 Number ---- 任意数值 String ---- 任意字符串 Boolean ---- true/false undefined ---- unde ...

  7. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  8. Update(Stage4):spark_rdd算子:第2节 RDD_action算子_分区_缓存:算子和分区

    一.reduce和reduceByKey: 二.:RDD 的算子总结 RDD 的算子大部分都会生成一些专用的 RDD map, flatMap, filter 等算子会生成 MapPartitions ...

  9. 易语言关于使用CURL,网页_访问,网页_访问S,网页_访问_对象,鱼刺(winHttpW)发送Get性能测试

    易语言关于使用 CURL,网页_访问,网页_访问S,网页_访问_对象,鱼刺(winHttpW)发送Get性能测试 测试模块情况: |-精易模块5.8  |-鱼刺类Http  |-libCURL +++ ...

随机推荐

  1. FZU 2280 Magic(字符串Hash)题解

    题意:给你n个字符串,每个字符串有一个值w,有q次询问,一共两种操作:一是“1 x y”表示把第x个串的w变为y:二是“2 x”,输出第x个串能放几次魔法.放魔法的条件是这样:用串x放魔法,如果在1~ ...

  2. LightOJ 1030 Discovering Gold (期望)

    https://vjudge.net/problem/LightOJ-1030 题意: 在一个1×N的格子里,每个格子都有相应的金币数,走到相应格子的话,就会得到该格子的金币. 现在从1格子开始,每次 ...

  3. 一款表达谱数据分析的神器--CCLE--转载

    现在做生物和医学的,很多都可能会和各种组学数据打交道.其中表达谱数据总是最常用的,也是比较好测的.即使在工作中不去测序,也可以利用已有的数据库去做一些数据挖掘,找一找不同表型(比如癌症)对应的mark ...

  4. docker容器互联 (.net core容器,mysql容器)

    背景 有两个容器一个运行的.net core的项目 另一个运行的mysql的数据 并且这两个容器在同一个机子上(或者局域网),那么理论上.net core的项目去访问mysql是可以走内网的 但是容器 ...

  5. <<网络是怎样连接的>>笔记第6章 request到达Web server, return response to browser

    短短漫长旅程迎来终点. 概览.整体结构. 服务器的协议栈如何接收数据. 服务器解释request message并respond browser 接收response message并显示内容. 6. ...

  6. phpstorm 2017版代码提示功能开启解决方案

    安装好phpstorm 2017之后 发现代码高亮和函数自动提示都失效了 在phpstorm底部面板的信息提示处发现有一条系统消息: 12:04:18 Power save mode is on Co ...

  7. 数论练习(4)——同余方程(扩gcd)

    CODEVS 1200 同余方程 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含 ...

  8. EPANET头文件解读系列6——HASH.H

    该文件是EPANET中HASH.C的头文件,下面列出了该文件的源码以及我的中文注释 /* HASH.H**** Header file for Hash Table module HASH.C***/ ...

  9. JS之replace

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 知名第三方编译版tete009 Firefox 24.0

    Firefox除了官方版本上还有许多由爱好者自己编译修改的第三方版本. 其中 tete009 是十分流行的一个版本,目前tete009 Firefox 24.0 版本发布. tete009版Firef ...