分类目录归档:语言

关于类,对象以及成员的内存分布,友元关系


关于类,对象和成员的内存分布

介绍

c++ 程序的内存格局分为4个区,全局数据区,代码区,栈区,堆区,全局数据区存放全局变量,静态数据和常量。所有类成员函数和非成员函数代码存在代码区,为运行函数分配的局部变量,函数参数,返回数据,返回地址等存放在栈区,余下的空间都被称为堆区。

对象是类的实例

c++ 程序的内存格局分为4个区,全局数据区,代码区,栈区,堆区,全局数据区存放全局变量,静态数据和常量。所有类成员函数和非成员函数代码存在代码区,为运行函数分配的局部变量,函数参数,返回数据,返回地址等存放在栈区,余下的空间都被称为堆区。

对象的存储大小

  1. 如果有虚函数,则多一个vptr指针
  2. 如果有虚基

Read more

关于C++中的虚函数,虚继承和虚基类


虚函数机制

  1. 虚函数简单来说,就是在基类成员函数名字前面加上virtual关键字,通过派生类重写函数来实现,纯虚函数就是只有虚函数声明,没有具体定义,任何派生类都需要定义自己的实现方法。
  2. 特别注意的是virtual关键字只能修饰类中成员函数,不能修饰类外函数定义,纯虚函数的声明方式就是在虚函数原型后加“=0”。
  3. 基类中的虚函数,如果有定义,哪怕是空定义,它的作用就是让这个函数能够在子类里面被重写,这样的话,编译器后期绑定实现多态,纯虚函数只是一个接口,具体的要在子类中实现。
  4. 要注意的是,虚函数可以在子类中不重写,但是虚函数一定要在子类中实现才能实例化子类。虚函数的类是为了实现继承,继承接口也继

Read more

C++中的class ,struct,union


三者异同

class和struct没有什么区别,都可以包含成员函数,可以继承,可以实现多态等等,不同之处如下:

 class 默认是private struct 默认是public
 class 继承后,默认成员访问是private,struct 继承也是public
 如果定义了构造函数,二者都不能使用大括号进行初始化,如果没有构造函数,struct可以用{}初始化,class 只有当所有成员都是public的时候才能使用{}进行初始化。
 C和 C++中的union: 
    一种数据结构,在C中是一个结构体,在C++中是一个类,可以有访问权限,成员函数,成员变量,构造和析构。
    

Read more

::范围解析运算符和 namespace


::范围解析运算符

  1. ::可以作为全局作用域符。用于类型名称前,如在程序中的某一处你想调用全局变量a,那么就写成::a;(也可以是全局函数)
  2. 类作用域符: 用于表示指定类型的作用域范围是具体某个类,如果想调用class A中的成员变量a,那么就写成A::a;
  3. 命名空间作用域符:用于表示指定类型的作用域范围是具体某个命名空间。如std::cout

namespace命名空间

介绍

命名空间是定义一种新的声明区域来创建命名的名称空间。

用途

这样目的之一是提供一个声明名称的区域,一个名称空间中的名称不会另一个名称空间的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中的东西

使用using

Read more

volatile ,assert,inline和sizeof


volatile

介绍

volatile 是指从内存中读取变量数据,防止编译器在处理过程中进行优化。 可以与const连用,例如只读状态寄存器,可以与指针连用,例如:中断服务子程序修改一个指向buffer的指针。

用途

中断服务程序提供给子程序的检测的变量
多任务系统运行时候共享的变量。
存储器映射的硬件寄存器也要加,一般来说不同的读写意义不一样。
在多线程中使用的变量,可以使用volatile,但是不建议用,一般建议使用锁或者原子操作。如果了多个线程使用一个变量的时候,如果不使用volatile。可能这个变量在内存中,也可能被加入到寄存器中,这样使用的不同变量。使用volatile 意思是让

Read more