C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new
一、局部类
局部类就是定义在函数内部的类,因为作用域只是在函数内部,所以,所有成员定义必须完整,在Qt的源码中有几处使用了局部类,见博客https://blog.csdn.net/Master_Cui/article/details/109162220
因为局部类必须定义完整,所以不能在局部类中声明static成员变量,如果定义了static成员变量,要把static成员变量的定义放在类的外部,与局部类必须完整相违背
二、位域
位域就是含有一定数量二进制位的变量,变量的类型通常应该是无符号整形。位域的声明形式是变量名后跟一个冒号和一个常量表达式,表达式用来指定变量所占的二进制位数
在QT的源码中,有几处使用了该技术。见博客https://blog.csdn.net/Master_Cui/article/details/109007524
因为变量使用了位域后,变量所占的内存就会变小,位域一般在底层开发中用的比较多。
示例
union uploaddata
{unsigned char buffer[4];struct datastr{unsigned int audiocount:3;unsigned int videocount:3;}data;
};
上述代码中,通过位域表示audio和video的数量,并通过buffer把数据发送给其他模块
三、volatile
如果一个变量是volatile的,那么表示告诉编译器不应该对这样的变量进行优化,这样,每次取volatile变量的值时,都会从内存中进行存取,而不会到缓存中存取。从而保证读取volatile变量值的准确性
一般也是在底层开发中用得较多
四、链接指示
C++有时需要使用其他语言的代码,在C++中,使用链接指示指出其他非C++语言的代码
最常见的是调用C编写的函数,此时就需要用extern "C"
示例
extern "C" {int strcmp(const char *str1, const char *str2);char *strcat(char *des, const char* src);
}
上述两个函数就被放在extern "C"的链接指示中,表示是两个C语言函数
因为C语言不支持重载,所以extern "C"中不能有同名函数
extern "C" {void func();void func(int );
}
一切C++特有而C中没有的特性都不能加在extern "C"中
五、枚举
枚举就是一系列整形值的集合。当对枚举进行初始化时,要使用枚举成员,即使使用的整形值和枚举成员的值相等,也不能用整形只初始化枚举对象
示例
enum state
{stop=1,pause=2,play=3
};int main(int argc, char const *argv[])
{state s1=stop;s1=3;
}
如果硬要使用整形值初始化枚举对象,那么使用static_cast吧
int main(int argc, char const *argv[])
{state s1=stop;s1=static_cast<state>(3);
}
六、定位new
一般的new运算符负责在heap堆中找到一个足以能够满足要求的内存块。new运算符还有另一种变体:定位new运算符(placement new),它能够在分配内存时指定内存的位置。
定位new有以下几种形式
place_address是个地址,指向内存空间,所以,定位new只构造对象并不分配内存
示例
class test
{
public:test(){}~test(){}
};int main(int argc, char const *argv[])
{char buffer[256];//char *buffer=new char[256];char *p=buffer;int *pi=new(p) int;cout<<pi<<endl;p+=sizeof(int);int *pai=new(p) int[10];p+=sizeof(int[10]);cout<<pai<<endl;test *ptest=new(p) test();cout<<ptest<<endl;ptest->~test();//delete ptest;//delete buffer;
}
buffer已经在栈上分配内存,所以,buffer在代码块结束后,会自动释放;
如果buffer通过new分配,则需要使用delete释放
对于正常new得到的类对象。delete时会先隐式调用析构函数释放对象,然后调用operator delete释放内存空间
但是对于定位new构造的对象,要显式调用它们的析构函数来销毁对象即可,因为定位new不负责分配内存(析构函数只是销毁对象,并不释放对象的内存)
所以,不能使用delete释放定位new创建的对象的内存,因为delete的这两个动作被拆开了
使用delete会造成错误。
所以,对象需要在buffer释放前,显式的调用析构函数
参考
《C++ Primer》
https://blog.csdn.net/qq2071114140/article/details/89287373
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new相关推荐
- C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)局部类
1. 局部类 ( local class) 局部类的所有成员( 包括函数在内 ) 都必须完整定义在类的内部. 因此, 局部类的作用与嵌套类相比相差很远 在局部类中不允许声明静态数据成员 局部类不能使用 ...
- C++模板类嵌套类内部类局部类的区别
模板类就是将类定义成模板的形式. C++中好像不区分内部类与嵌套类两个名词. 内部类与嵌套类都是指在类中定义类. 局部类是指在函数中定义类. (c++不能在函数中定义函数(python可以).c++在 ...
- 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof
面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...
- C++ 嵌套类与局部类
代码编译运行环境:VS2017+Debug+Win32 文章目录 1.嵌套类 2.局部类 参考文献 1.嵌套类 在一个类体中定义的类叫作嵌套类.拥有嵌套类的类叫外围类. 定义嵌套类的初衷是建立仅供某个 ...
- 【整理】C#2.0特性之局部类、空属类型和静态类
局部类 在没有局部类出现之前,我们采用下面方法定义类: Code public class App { public void Foo() { // } ...
- Java方法工厂,接口,常用日期类Date面向对象,匿名内部类局部类
抽象 1抽象类不能生成对象 2类中包含抽象函数,这个类必须声明为抽象类 3抽象类不一定有抽象方法.有抽象方法必须是抽象类 4若全是抽象方法,则为接口 接口 比如 interface action{vo ...
- Java方法中的局部类和匿名类
1.局部类 在一个方法中定义的类称为方法中的内部类,或者叫做局部类(local class). 示例:Ex5_TestInnerInMethod.java方法中的内部类 public class ...
最新文章
- 不可思议的数字:互联网每天到底能产生多少数据?
- 无法解析的外部符号 __imp__curl_easy_init
- 爬虫的配置、启动和终止
- linux下开启程序崩溃生成core文件开关之ulimit详解
- Hadoop服务器集群安装部署及配置
- 反射和代理的具体应用
- Batch request processing in backend
- 【转】医学图像中的窗宽、窗位!!
- 人工智能自拍之后,会怎样给自己P图?
- mysql 5.6.34 二进制下载_mysql 5.6.34 二进制
- 全球第一张中文网络协议分析图——By 成都科来软件
- 测试用例设计——软件测试基础
- 数学建模方法——斯皮尔曼相关系数及其显著性检验 (Spearman’s correlation coefficient for ranked data)
- 中兴配置dhcp服务器,在中兴接入层交换机上配置DHCP Snooping
- matlab 提高运行速度,提高matlab运行速度
- 关于BTA12-600B双向可控硅应用中遇到问题的思考
- 期货平仓/强制平仓/爆仓-股市平仓建仓
- ECDSA 签名验证原理及C语言实现
- 聊聊职场 - 个人发展
- iphone开发笔记和技巧总结
热门文章
- eclipse下classes文件夹无法发布到tomcat的问题--tomcat发布慢的问题
- Mac OS X 10.10, Eclipse+ADT真机调试代码时,Device Chooser中不显示真机的解决方式
- HDU 3826 Squarefree number:题目解答源码
- linux线程函数大全
- 垂直网站架构改造 - 怎样成为一个山寨CTO
- Spark的RDD行动算子
- Quantile Regression,python
- Feature Selection Based on Mutual Information:Criteria of Max-Dependency, Max-Relevance,and Min-Redu
- Github多人合作用法
- HTML5手机页面里面如何把长按复制避免