内存分区

栈区: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("狗蛋",); // 调用有参构造函数
cout<<t2.getName()<<" "<<t2.getAge()<<endl;
    Teacher t3("王八蛋"); // 调用有参构造函数
cout<<t3.getName()<<" "<<t3.getAge()<<endl;
  system("pause");
  return ;
}

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 = ;
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;
}

运行结果:

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. SpringBoot与Dubbo整合下篇

    (1)pom.xml引入相关依赖jar包,如下: <dependency> <groupId>com.alibaba</groupId> <artifactI ...

  2. git branch 误删 分支 找回

    今天在写东西的时候,把自己的dev分支给删掉了.并且手贱的是吧远程分支也删掉了. 但是好在我强大的git!!!,把他找回来是分分钟的事情. 一.查看一下提交记录 git log -g 会有一个列表.如 ...

  3. 浅谈webpack优化

    webpack优化方案 1. 优化开发体验 1-1. 加快构建速度 ① 缩小文件搜索范围 由于 Loader 对文件的转换操作很耗时,需要让尽可能少的文件被 Loader 处理,用include和ex ...

  4. RPC框架实践之:Apache Thrift

    一.概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务.在文章 微服务调用链追踪中心搭建 一文中模拟出来的调 ...

  5. UVA-11903 Just Finish it up

    题目大意:一个环形跑道上有n个加油站,每个加油站可加a[i]加仑油,走到下一站需要w[i]加仑油,初始油箱为空,问能否绕跑道一圈,起点任选,若有多个起点,找出编号最小的. 题目分析:如果从1号加油站开 ...

  6. 直方图及low_value、high_value

    直方图 Histogram是一种特殊的列统计信息,详细描述了目标列的数据分布情况.存储在数据字典基表 histogram$; 专门为了准确评估分布不均匀的目标列的可选择率.结果集的cardianlit ...

  7. HTML 5之meta标签viewport应用

    关于viewport的概念: 先了解移动设备的屏幕尺寸和设备尺寸: iPhone3 设备尺寸 320*480 ; 屏幕尺寸  320*480 iPhone4 设备尺寸 320*480 ; 屏幕尺寸   ...

  8. google搜索 site:pku.edu.cn inurl:aspx 即可查找所有动态网页 =====html(静态网页) asp(动态) jsp(动态) php(动态) cgi(网络程序) aspx(动态)

    shodan shodan和我们国内的钟馗之眼是一种搜索引擎,他们区别于百度等引擎,他们只爬设备,只爬联网设备. 网址为: https://www.shodan.io/ Shodan,也有人把他叫撒旦 ...

  9. 《剑指offer》习题解答(C/C++)

    1.二维数组中的查找 /* 题目:在一个二维数组中,没一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  10. BZOJ2223 [Coci 2009]PATULJCI

    求区间内个数大于rank的一个数 主席树求一下就好啦! /************************************************************** Problem: ...