C++类与内存

在C++类成员中引用,常量,静态变量,静态函数等,它们被分配在内存的那个地方,有哪些特性。

1.常量和引用必须重载构造函数进行初始化,否则就会编译失败, new 的时候再堆上,直接创建在栈上。值得说明的是:C++类成员常量与C语言常量一样,通过指针可以修改其的值。类的外部常量一旦初始化以后,不会读内存,从代码区的符号表自动生成,

2.静态变量,分配在静态区域,其属于整个类,而不属于具体对象。

3.类的成员函数都在代码区,类的函数都是共享的。另外静态成员函数与对象没有关系。

#include<iostream>
using namespace std;
class Test
{
public:
	int num;
	const int con_num; // new 的时候再堆上,直接创建在栈上
	int & ref_num;// new 的时候再堆上,直接创建在栈上
	static int s_num;//静态区

	//常量和引用必须重载构造函数进行初始化,否则就会编译失败
	Test(int in_ref_num, int in_con_num) :con_num(in_con_num),ref_num(in_ref_num)
	{
		cout << "修改前:" << con_num << endl;
	        int *p = (int *)&con_num;
		*p = 100;
		cout << "修改后:" << con_num << endl;
	}
	static void s_fun()
	{
		cout << "hello s_fun" << endl;
	}
	void fun()
	{
		cout << "hello fun" << endl;
	}
};

 int Test::s_num = 0; //静态成员函数初始化

void main()
{
	// 类名 变量名 //栈上
	//类名 *p = new 类名 //在堆上
	//类的静态成员,静态区
	//类的函数都在代码区,类的函数都是共享的。

	Test test(1, 2);

	void(*p_s_fun)() = &Test::s_fun;//静态成员函数,与对象无关

	void(Test::*p_fun)() = &Test::fun;//代码共享,所有的类对象共享对象,

	 p_s_fun();//使用函数指针,直接调用类的静态成员函数
	(test.*p_fun)(); //通过函数指针访问类的成员函数,必须使用具体对象调用

	cin.get();

}

时间: 2024-11-09 20:26:04

C++类与内存的相关文章

C++类的内存分布

使用Visual Studio工具来看是类的内存分布 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局.近期的VS版本都支持这样配置. 下面可以定义一个类,像下面这样: class Base { int a; int b; public: void CommonFunction(); };

《C++反编译与逆向分析技术揭秘》之学习笔记02--结构体和类之内存分布

※结构体和类之内存分布 1.空类的大小空类:其实空类至少会占用1个字节的长度. 2.字节对齐在为结构体和类中的数据成员分配内存时,结构体中的当前数据成员类型长度为M,指定对齐值为N,那么实际对齐值位q=min(M,N),其成员的地址安排在q的倍数上. vc6.0缺省对齐8个字节sShort占用2个字节,所以安排的地址0x0012FF70为2的倍数.nInt占用4个字节,所以安排的地址0x0012FF74为4的倍数.因为结构体中最大的字段长度为4,所以对齐值调整为4个字节.因为test对象为8个字

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

Java内存分配(直接内存、堆内存、Unsafel类、内存映射文件)

1.Java直接内存与堆内存-MarchOn 2.Java内存映射文件-MarchOn 3.Java Unsafe的使用-MarchOn 简单总结: 1.内存映射文件 读文件时候一般要两次复制:从磁盘复制到内核空间再复制到用户空间,内存映射文件避免了第二次复制,且内存分配在内核空间,应用程序访问的就是操作系统的内核内存空间,因此极大提高了读取效率.写文件同理. 2.堆内存分配与直接内存分配: Java申请空间时通常是从JVM堆内存分配的,即 ByteBuffer.allocate(int cap

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

类对象内存分布

================================================================================================ 如何计算类对象占用的字节数? 一个空类的话1个字节.这是为了保证n个连续空类声明时,变量地址有偏移,防止变量覆盖. 非空类的话用关键字sizeof计算.如果手工计算就相当麻烦,光padding就一堆规则了.而且有些额外信息比如虚函数(多个虚函数也只产生一个vptr指针)等等.一个类成员 ,当有虚函数时,有

OC5_复合类的内存管理

// // Person.h // OC5_复合类的内存管理 // // Created by zhangxueming on 15/6/18. // Copyright (c) 2015年 zhangxueming. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject //先release 再 copy @property (copy,nonatomic) NSStrin

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

关于虚函数,类的内存分布以及类的成员函数调用原理

1.类的内存分布 空类为了占位,空间占一个字节 成员函数,静态函数,静态变量并不占内存(不和类放在一起) 所有的虚函数也并不和类放在一起,而是将所有的虚函数构造成一个虚函数表,用一个指针指向这个虚函数表,类仅仅存储这个指针,一个指针在32位的机器上占四个字节 所有的非静态成员变量占内存 因此,类的内存分布=所有的非静态成员变量+虚指针(自创的名词:即指向虚函数表的指针) 2.虚函数的原理 一个非继承的类:一个虚指针(指向他的虚函数表). 一个单继承的类:一个虚指针(指向他的虚函数表,这个虚函数表