C++primer阅读笔记---------特殊工具与技术

来源:互联网 发布:数控圆弧编程举例 编辑:程序博客网 时间:2024/06/05 07:15

该博客用于记录自己在阅读过程中不懂的知识点,很少用到但比较重要的知识点以及模棱两可的知识点



声明了noexcept,但函数体中又定义了throw抛出异常,在大多数编译器下,这种操作会顺利通过,但遇到这种情况编译器会在异常抛出后立即调用terminate以保证不违反noexcept的承诺


标准库分别定义了四个operator new和operator delete的重载版本,用户可以在全局和类中自定义,当自定义的版本在类中的时侯new和delete必须是静态的(隐式静态),且不能操作类的任何数据成语

void *operator new(size_t, void*);     //不允许用户重新定义这个版本

我们无法自定义new和delete的行为,我们使用new总是先调用operator new来申请空间,再在此空间构造对象,使用delete是先摧毁对象再调用operator delete来释放空间,在这里使用operator定义的函数并不和是重载运算符一样重载了new和delete的行为含义,而是改变了他们对内存的管理方式

对于operator类申请的空间我们不能使用construct函数来构造对象(allocator)

定位new 允许我们再一个已经分配的内存地址上构造对象

a.A::A();//显示调用构造函数,写成a.A()会报错。
a.~A();//显示调用析构函数,但是此时对象a并没有销毁。
显式调用构造函数和析构函数就想调用一般的函数一样,并不意味着创建或销毁对象。但是注意,如果构造函数中动态分配了空间,则显式调用构造函数会出现内存泄露;如果析构函数中释放动态分配的空间,则会出现多次释放同一内存,会出现严重错误。

系统隐式调用析构函数的时候,会加入释放栈内存的动作(而堆内存则由用户手工的释放)
用户显式调用析构函数的时候,只是单纯执行析构函数内的语句,不会释放栈内存,摧毁对象

运行时类型时别的功能由两个运算符实现(有风险)
  typeid  返回表达式类型
  dynamic_cast   将基类指针或引用安全的转换为派生类的指针或引用

限定作用域的枚举类型赋值时应加上作用域限定符
  enum class A{a, aa, aaa};     //限定,成员不会隐式的转换为int
  enum A{a, aa, aaa};           //不限定,成员会隐式的转换为int

类的静态成员不属于任何对象,所以静态成员的指针与普通指针没有什么区别,所以成员指针指向类的非静态成员
string myclass:: *p 指向myclass类的string类型的成员
myclass test;
auto s = test.*p;
指向成员函数的指针
string (myclass::*p)(int, int) const;     p指向myclass中含有两个形参返回值为string的常量成员函数(只能读取而不能修改其所属对象的数据成员。)
(test.*p)(0, 0);

将成员函数用作可调用对象

嵌套类是一个独立的类,访问方面与普通类基本相同,区别是嵌套类的作用域只在外层类中

union可以有多个数据成员,但每个时刻只有一个数据成员可以有值,当我们赋值给其中一个数据成员后,其余的都被隐藏,union中不能含有引用类型,union也可以为其成员指定public等保护标记,成员可以是类类型,但它必须含有构造函数与析构函数,union不能继承和被继承,所以不能含有虚函数

匿名union不能定义成员函数和保护标记,直接访问其成员

将union的值改为成员中某个类类型的值的时候(或者相反),会调用类类型对应的构造函数(析构函数),如果类类型没有自定义默认构造函数和拷贝控制成员等,编译器将合成相应的函数并定义为删除的

可以使用类来管理简化union的构造销毁等操作,我们可以定义一个枚举类型来跟踪union成员的状态

局部类是定义在函数内部的类,一般很简单,不允许有静态成员,局部类只能使用外层作用域定义的类型名,静态变量,枚举成员

不可移植特性:
  算术类型再不同机器上不一样
  位域(位域类型必须是整型或枚举)
  volatile(程序的值程序控制或检测之外被改变,应声明为volatile,如系统时钟控制更新)
  链接指示(C++有时需要其他语言编写的函数)

阅读全文
1 0
原创粉丝点击