一、局部类

局部类就是定义在函数内部的类,因为作用域只是在函数内部,所以,所有成员定义必须完整,在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相关推荐

  1. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  2. C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示

    C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...

  3. C++ Primer 5th笔记(chap 19 特殊工具与技术)局部类

    1. 局部类 ( local class) 局部类的所有成员( 包括函数在内 ) 都必须完整定义在类的内部. 因此, 局部类的作用与嵌套类相比相差很远 在局部类中不允许声明静态数据成员 局部类不能使用 ...

  4. C++模板类嵌套类内部类局部类的区别

    模板类就是将类定义成模板的形式. C++中好像不区分内部类与嵌套类两个名词. 内部类与嵌套类都是指在类中定义类. 局部类是指在函数中定义类. (c++不能在函数中定义函数(python可以).c++在 ...

  5. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof

    面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...

  6. C++ 嵌套类与局部类

    代码编译运行环境:VS2017+Debug+Win32 文章目录 1.嵌套类 2.局部类 参考文献 1.嵌套类 在一个类体中定义的类叫作嵌套类.拥有嵌套类的类叫外围类. 定义嵌套类的初衷是建立仅供某个 ...

  7. 【整理】C#2.0特性之局部类、空属类型和静态类

    局部类 在没有局部类出现之前,我们采用下面方法定义类: Code public class App {      public void Foo()      {          //      } ...

  8. Java方法工厂,接口,常用日期类Date面向对象,匿名内部类局部类

    抽象 1抽象类不能生成对象 2类中包含抽象函数,这个类必须声明为抽象类 3抽象类不一定有抽象方法.有抽象方法必须是抽象类 4若全是抽象方法,则为接口 接口 比如 interface action{vo ...

  9. Java方法中的局部类和匿名类

    1.局部类   在一个方法中定义的类称为方法中的内部类,或者叫做局部类(local class). 示例:Ex5_TestInnerInMethod.java方法中的内部类 public class ...

最新文章

  1. 不可思议的数字:互联网每天到底能产生多少数据?
  2. 无法解析的外部符号 __imp__curl_easy_init
  3. 爬虫的配置、启动和终止
  4. linux下开启程序崩溃生成core文件开关之ulimit详解
  5. Hadoop服务器集群安装部署及配置
  6. 反射和代理的具体应用
  7. Batch request processing in backend
  8. 【转】医学图像中的窗宽、窗位!!
  9. 人工智能自拍之后,会怎样给自己P图?
  10. mysql 5.6.34 二进制下载_mysql 5.6.34 二进制
  11. 全球第一张中文网络协议分析图——By 成都科来软件
  12. 测试用例设计——软件测试基础
  13. 数学建模方法——斯皮尔曼相关系数及其显著性检验 (Spearman’s correlation coefficient for ranked data)
  14. 中兴配置dhcp服务器,在中兴接入层交换机上配置DHCP Snooping
  15. matlab 提高运行速度,提高matlab运行速度
  16. 关于BTA12-600B双向可控硅应用中遇到问题的思考
  17. 期货平仓/强制平仓/爆仓-股市平仓建仓
  18. ECDSA 签名验证原理及C语言实现
  19. 聊聊职场 - 个人发展
  20. iphone开发笔记和技巧总结

热门文章

  1. eclipse下classes文件夹无法发布到tomcat的问题--tomcat发布慢的问题
  2. Mac OS X 10.10, Eclipse+ADT真机调试代码时,Device Chooser中不显示真机的解决方式
  3. HDU 3826 Squarefree number:题目解答源码
  4. linux线程函数大全
  5. 垂直网站架构改造 - 怎样成为一个山寨CTO
  6. Spark的RDD行动算子
  7. Quantile Regression,python
  8. Feature Selection Based on Mutual Information:Criteria of Max-Dependency, Max-Relevance,and Min-Redu
  9. Github多人合作用法
  10. HTML5手机页面里面如何把长按复制避免