语义学

C++对象构造语义学

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-27 05:41:59
1 对象赋值及析构语义学 1.1 对象复制 当我们没有写默认的拷贝构造函数并且不满足编译器为我们默认合成构造函数的条件,当我们拷贝构造一个对象时,编译器也会进行一些特殊的复制处理 EG: #include<iostream> using namespace std; class A { public: int a; }; int main() { A a; a.a = 1; A a1 = a; cout << a1.a << endl; //打印1 return 0; } 1.2 对象析构 在以下两种情况下,如果我们自己没有写析构函数,编译器会为对象合成析构函数: 继承的基类中有析构函数,编译器会为派生类合成一个析构函数调用基类的析构函数 存在某一个成员变量类型为类A(类A有析构函数) 2 new与delete探究 2.1 new后面加不加括号的区别 EG: #include<iostream> using namespace std; class A { public: int a; }; class B { public: B() { } int b; }; int main() { //对于类A,我们没有自己提供构造函数 /* A a; cout << a.a << endl; //会报错,使用未初始化变量 A a1 = A(); cout << a1.a << endl;

C++函数语义学

老子叫甜甜 提交于 2020-01-14 05:42:21
1 函数调用方式 1.1 普通成员函数调用方式 我们或许会认为调用类成员函数的开销会大于调用普通函数,但是其实不是这样的,调用普通成员函数和全局函数开销差不多,我们可以在VS中调试,查看反汇编代码。普通成员函数在调用的时候编译器会在传递一个对象的this指针 1.2 虚函数的调用方式 EG: #include<iostream> using namespace std; class A { public: int a; virtual void func() { } void test1() { func(); //由于是用this指针调用func函数,所以会查询虚函数表 } void test() { A::func(); //这种方式调用func函数不会查询虚函数表 } }; int main() { A a = A(); a.func(); //不会查询虚函数表 a.test(); //test函数内部调用func函数不会查询虚函数表 a.test1(); //test1函数内部调用func函数会查询虚函数表 return 0; } 1.3 静态成员函数的调用 EG: #include<iostream> using namespace std; class A { public: int a; static void func() { cout << "静态成员函数" <<

构造函数语义学——Copy Constructor 的构造操作

十年热恋 提交于 2019-12-03 15:02:52
前言 在三种情况下,会以一个 object 的内容作为另一个 class object 的初值: object明确初始化 class X{...}; X x; X xx = x; object 被当作参数交与某个函数 extern void foo(X x); void bar(){ X xx; foo(xx);//作为第一个参数的初值(不明显的初始化) } 函数返回值是一个 class object X foo_bar(){ X xx; ... return xx; } 如果开发者已经明确定义了一个copy constructor 如下: //copy constructor可以是多参数,其中有一个参数是其class type X::X(const X& x); Y::Y(const Y& y); 那么在大部分情况下,当 class object 以另一个同类实体作为初值时,上述 constructor 会被调用,这可能会导致一个暂时性 class object 的产生或程序代码发生改变(或二者都有)。 重新设定 Virtual Table 的指针 ​ 编译期间的扩张操作(只要有一个class声明了一个或多个virtual function): 增加一个 virtual function table(vtbl),内含每一个有作用的 virtual function 的地址。

构造函数语义学——Copy Constructor 篇

跟風遠走 提交于 2019-12-01 19:02:00
构造函数语义学——Copy Constructor 篇 本文主要介绍《深度探索 C++对象模型》之《构造函数语义学》中的 Copy Constructor 构造函数的调用时机 首先需要明确,构造函数何时会被调用呢?cppreference 中已经有了足够详细地说明: 凡在对象从同类型的另一对象(以直接初始化或复制初始化)初始化时,调用复制构造函数(除非重载决议选择了更好的匹配或其调用被消除),情况包括: 初始化:T a = b; 或 T a(b);,其中 b 类型为 T; 函数实参传递:f(a);,其中 a 类型为 T 而 f 为 Ret f(T t); 函数返回:在如 T f() 这样的函数内部的 return a;,其中 a 类型为 T,它没有移动构造函数。 编译器合成 copy constructor 的条件 在之前《构造函数语义学——Default Constructor 篇》一文中,我们分析了编译器产生 default constructor 的条件,以及编译器所产生的 default constructor 的类型(trivial & non-trivial);对于构造函数来说,其原理也是大致类似的,只是具体的细节条件不同,此文中就不再给出具体的证明,读过前一篇博文的读者也应该能够自己分析,此文只给出具体的条件 编译器隐式声明&定义 copy constructor