C++面向对象高级编程(下) 第二周笔记 GeekBand

1.vptrvtbl

当存在虚函数就会出现虚指针vptr指向虚函数所在位置vtbl

将vptr实现vtbl内容翻译为C: 
(*p->vptr)n; 
(* p->vptr[n])(p);

动态绑定: 虚机制 
1.指针 
2.向上转型保证安全 
3.调用的是虚函数

2.this指针

[Template Method]

This->Serialize()实现: 
(*(this->vptr)[n])(this) -动态绑定

3.动态绑定

向上转型 : 指针实现

如 B继承A 
B b; 
A a = (A)b; 
a.vfunc1(); 此时,是静态绑定,调用的是A类的vfunc1()

A* pa = new B; 
pa->vfunc1(); 这里必须是动态绑定啊,这里是指针.

pa = &b; 
pa->vfunc1(); 这里依旧是动态绑定.

4.const

void function() const { return data;} 
const一般放在成员函数后头,不放在全局函数后头. 
在成员函数后面加const是属于签名, 就是当两个成员函数传参相同,那么加不加const也会被区分成两个函数. 
在内存共享的情况下, 要考虑内容被更改时所产生的问题. 
class template::std::basic_string<..>有如下成员函数: 
charT operator[] (int n) const 
{ //不必考虑COW} 
reference operator[] (int n) 
{ //必须考虑COW }

COW: Copy on write

所以这个类里面, 当定义的是常量对象的时候,就会被强制调用const成员函数, 当定义的不是常量对象,那么就会调用非const成员函数.

那么这里,当是非常量对象时, 也可以const成员函数.
规则:当成员函数的const和non-const版本都存在<>时, const对象只能调用const版本, non-const对象只能调用non-const版本.

5.关于New,Delete

new对象的流程不能更改,但是实现过程中的函数可以被更改. 
operator new 
operator delete

6.重载::operator new, ::operator new[],::operator delete ,::operator delete[]

在全局当中: 
Note: 如果你重载了全局的操作符, 所以要额外小心. 
这些重载不可以被声明在一个namespace中.

//这里的函数是编译器去调用, 所以size是编译器给出. 
void* operator new( size_t size ) 
{ return malloc(size);}

void* operator new[]( size_t size ) 
{ return malloc(size);}

void* operator delete(void* ptr ) 
{ free(ptr);}

void* operator delete[](void* ptr ) 
{ free(ptr);}

重载 member new , delete

在class里面重载new, delete

class foo{ 
public: 
void* operator new(size_t size); 
void operator delete(void *, size_t size); //size为可选 
…….

}; 
那么你在: 
foo *a = new foo; 
delete a; 
就会调用上面重载的函数.

new[] , delete[] 也如此.

7.实例

当类中重载了new , delete , 而又想调用全局的new , delete 
可以这样写: 
::delete a;

string类内其实是一个指针.

当创建一个数组的时候, 内存当中就会多分配一个指针,该指针用于保存当前数组个数.

8.重载new(),delete()示例

允许重载成员函数new(….) 其中参数中,必须有第一个且第一个必须是size_t size. 其余参数以new所指定的placement argument为初值.

Foo* p = new(300,’c’)Foo; //这里是三个参数

我们也可以重载类成员函数 operator delete() ,写出多个版本. 但他们绝不会被 通常所使用的delete调用.只有当new所调用的ctor抛出 异常,才会调用这些重载版的operator delete(). 它们只能这样被调用,主要用来归还未能完全创建成功的对象所占用的内存.

9.Basic_String使用new(extra)扩充申请量

Basic_String在重载new()过后,传递了一个extra参数, 用于后台自动多申请extra空间。

时间: 2024-08-06 03:39:25

C++面向对象高级编程(下) 第二周笔记 GeekBand的相关文章

C++面向对象高级编程(下) 第一周笔记 GeekBand

1.Conversion Function 转换函数 class Fraction{ public: operator double() const { //转换不可能改变类里的成员,通常加上const return (double)(m_numerator / m_denominator); }//把Fraction对象转换成double类型,double()不可有参数,返回类型不用写 private: int m_numerator; int m_denominator; }; Fracti

C++面向对象高级编程(上) 第二周笔记 GeekBand

static: (1)static成员数据:例如像银行IT系统中的利率,并不是每个用户拥有一份,而是所有账户都有统一的利率,可以加static,表明所有账户共有相同利率. static成员数据要在class外定义. 例:class Account{ public: static double m_rate; static void set_rate(const double& x){m_rate=x;} } double Account::m_rate=8.0; (2)static成员函数:没有

C++面向对象高级编程(上) 第一周笔记 GeekBand

1.防卫式声明: 例: #ifndef ___COMPLEX___ #define ___COMPLEX___ ... #endif 2.内联函数:inline 函数是否真正为内联式函数,最终取决于编译器编译方式. 3.构造函数: 例: class complex{ public: complex(double r=0,double i=0):re(r),im(i){} ... } 对象初始化尽量采用初始化列表的方式. 4.构造函数重载: 5.单例模式        构造函数被放在private

《UNIX环境高级编程》第二版源码在Ubuntu下的编译

涂鸦一文,自娱娱乐. 无题 草舍如沙天地卷,且放白鹿青崖间.   望闻问切麻雀全,漫卷诗书彩云乡.   天地琴心天地曲,天际行将遥望远.   大浪淘沙鲁智深,乱云飞渡仍从容. <UNIX环境高级编程>第二版源码在Ubuntu下的编译

Boolan C++面向对象高级编程学习第五周

本周C++面向对象高级编程编程主要是讲三个方面 1.虚表和虚指针 虚指针:如果类(包括父类)中有虚函数,就一定会有虚指针,虚指针是指向虚函数的虚表. 虚表:虚指针指向的一种类的表,表上存有类里面虚函数的实现的指针 这里虚函数和虚表一般是和类的多太性结合在一起来使用的,子类调用虚函数是通过调用虚指针来调用虚函数表里面的指针再来实现函数特性 这种调用的方式叫做动态绑定,是一种通过指针类型自动来判断调用的对象,在实现中可以不用区分哪个对象从而调用对应的函数 我们普通的调用类里面的函数叫做静态绑定 2.

C++面向对象高级编程(三)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主要围绕不带指针的class complex本节中主要围绕带指针的String类 前面我说过如果你创建的类不带有指针,那么多半你可以不用写析构函数,但是如果你创建了一个带指针的类,那么你必须重写Big Three 创建一个类

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...

C++面向对象高级编程(二)

版权声明:本文为博主原创文章,未经博主允许不得转载. 接下来的几篇文章,我将回忆一下C++的基础. C++的由两部分组成 1.C++语言 2.C++标准库 本篇文章主要分享我学习C++语言的笔记. 这次主要回忆一下操作符重载. 先看一段代码,后续我会介绍这么做的原由 #include <iostream> class complex { public: complex(double r = 0, double i = 0) : re(r) ,im(i) {} complex& oper

[7]面向对象高级编程

[7]面向对象高级编程 数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: >>> class Student(object): ... pass ... 然后,尝试给实例绑定一个属性: >