C++技能重拾

0、虽然静态成员函数不存在this指针,但还是不能在一个class里声明同名同参的虚函数和静态成员函数。

1、vftable里一个虚函数表是一个指针

2、delete本质,调用析构函数同时释放内存
Object *o = new Object();
// use object
delete o; // which first calls the destructor (if any) on its argument and then returns the memory allocated by new back to the free store.
o = NULL;

3、classA *p = new classB;
delete p; //如果classB没有析构虚函数,则调用classA的析构函数
仔细想,也只能调用原生A的析构了!

4、基类部分在派生类部分之前被构造,当基类构造函数执行时派生类中的数据成员还没被初始化。如果基类构造函数中的虚函数调用被解析成调用派生类的虚函数,而派生类的虚函数中又访问到未初始化的派生类数据,将导致程序出现一些未定义行为和bug。

5、子类的同名静态或非静态函数会覆盖父类的!

6、如果一个虚函数被继承下来而没有改变,那么虚函数中指针实际指向为父类,蛋疼,注意!!!

7、虚函数重载时,子类修改了父类的缺省的参数值,那么将根据指针本身的类型来决定缺省参数的值

8、virtual关键字的作用就是提示编译器进行迟后联编,告诉连接过程:“我是个虚的,先不要连接我,等运行时再说吧”。
1) 先期联编或静态联编:在编译时就能进行函数联编称为先期联编或静态联编。
2) 迟后联编或动态联编:在运行时才能进行的联编称为迟后联编或动态联编。

9、虚函数的原理:当编译器遇到virtual后,会为所在的类构造一个表和一个指针,那个表叫做vtbl,每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址.指针叫做vptr,指向那个表。而这个指针保存在相应的对象当中,也就是说只有创建了对象以后才能找到相应虚函数的地址。
为确保运行时的多态定义的基类与派生类的虚函数不仅函数名要相同,其返回值及参数都必须相同,否则即使加上了virtual,系统也不进行迟后联编。
10、运算符重载的原则

这样一看,运算符重载还是蛮简单的嘛,实际上运算符重载也是要遵循一些原则的:

1.C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符。

2.C++中绝大部分的运算符可重载,除了成员访问运算符.,作用域运算符::,长度运算符sizeof以及条件运算符?:。

3.运算符重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符。

4.重载不能改变运算符原有的优先级和原有的结合性。

6.运算符重载不能全部是C++中预定义的基本数据,这样做的目的是为了防止用户修改用于基本类型数据的运算符性质。

11、重载函数的定义:在相同的声明域中的函数名相同的,而参数表不同的,即通过函数的参数表而唯一标识并且来区分函数的一种特殊的函数。

12、为了估计哪个重载函数最适合,需要依次按照下列规则来判断:

精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;
提升匹配:即整数提升(如bool 到 int、char到int、short 到int),float到double
使用标准转换匹配:如int 到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;
使用用户自定义匹配;
使用省略号匹配:类似printf中省略号参数
如果在最高层有多个匹配函数找到,调用将被拒绝(因为有歧义、模凌两可)。看下面的例子:

void print(int);
void print(const char*);
void print(double);
void print(long);
void print(char);

void h(char c,int i,short s, float f)
{
print(c);//精确匹配,调用print(char)
print(i);//精确匹配,调用print(int)
print(s);//整数提升,调用print(int)
print(f);//float到double的提升,调用print(double)

print(‘a‘);//精确匹配,调用print(char)
print(49);//精确匹配,调用print(int)
print(0);//精确匹配,调用print(int)
print("a");//精确匹配,调用print(const char*)
}

时间: 2024-07-30 10:12:25

C++技能重拾的相关文章

C++技能重拾2

13.类成员函数重载:局部同名函数将隐藏而不是重载全局声明,不引入父类名字空间时子类的同名函数不会和父类的构成重载,静态成员函数可以和非静态成员函数构成重载.本质是重载函数的定义是在相同的声明域里!!!子类和父类,类内部和全局作用域都不是相同的作用域,因此无法构成重载!!! 14.当类声明了构造函数,但不是缺省构造函数(零参数)时,编译器也不会生成缺省构造函数. 15.构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造

重拾linux

重拾linux 起因 因为想重拾起linux,同时需要用docker起几个镜像,用来学习网络知识.本来想直接去阿里云上买,后来一想自己机器上,起一个linux是个不错的选择,毕竟不花钱! 还可以用来做本地测试,学习使用linux.docker等.记录下过程,防止以后忘记!(所以不会涉及具体的安装步骤) 下载 到网易开源镜像站,挑选一个linux下载.我安装linux只要是为了学习运维方面的知识,同时用于进行网络知识方面的实践.如果你跟我一样,推荐Ubuntu server版本,纯字符界面,就跟一

重拾qt

最近公司又接了一个煤矿的项目,要写个小程序摘取数据,我是公司唯一c++程序员,本来搞ios搞好好的,现在又得重拾半年没摸得qt了.呵呵...呵呵呵. 这里只记录这次小程序的一些小的总结吧.. 1.中文字符: 函数:把一般字符串转为中文字符串: //中文处理 QString mysqlServerTs:: handleTheChinesCode(const char*words){ QTextCodec* tc = QTextCodec::codecForLocale(); return tc->

重拾梦想,做更好的自己

亥时,就寝,忽入空灵,甲申年出师已历一纪,诸多记忆电光石火逐一闪现.时年家贫无靠,生计无着,每日波奔却心系梦想,虽日日身疲体倦,却每以<孟子·告子下>篇中名句“天降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行指乱其所为,所以动心忍性,曾益其所不能也”以慰寸心,类比篇中清史名人,胸中满溢浩然正气,行事尽显峥嵘:历12载,生活稳定,已婚并育一女,四老体健而心宽,内子贤而持家,小女伶俐活泼,此三项尽得,可谓得意了. 然忆及往昔践行之路与现时行走之途,高下立判,原所行皆可日日前行,步步

重拾C/C++基础

1.复制指针时只复制指针中的地址,而不会复制指针指向的对象2.解决护栏柱错误的根本 是 从思想认知上搞定. 数组的序号为偏移量.  也即: 数组的第一个元素为arrName[0],其偏移量为03.使用strcpy函数时要注意,若是源串的长度大于目标串的长度,将会覆盖缓冲区后面的内容  所以尽量使用strncpy来替代strcpy4.数组可以使一维或者是多维.只要数组包含的元素为内置类型或者有默认构造函数的类,就可以初始化5.数学运算符有5个: +(加) -(减) *(乘) /(除) %(求模)6

重拾算法(5)——最小生成树的两种算法及其对比测试

重拾算法(5)——最小生成树的两种算法及其对比测试 什么是最小生成树 求解最小生成树(Minimum Cost Spanning Tree,以下简写做MST)是图相关的算法中常见的一个,用于解决类似如下的问题: 假设要在N个城市之间建立通信联络网,那么连通N个城市只需N-1条线路.这时自然会考虑这样一个问题:如何在最节省经费的前提下建立这个通信网. 在任意两个城市间都可以设置一条线路,相应地都要付出一定的经济代价.N个城市之间最多可能设置N(N-1)/2条线路,那么如何在这些线路中选择N-1条,

[java]基础重拾

7.17 重新学习了包管理 对于没有使用package打包的类,归到默认包.使用其他包名打包类,必须在工程文件夹下新建对应包名的目录.比如 package com.tencent.demo 则需要在工程文件夹下,新建名为com的文件夹,并在com文件夹下新建tencent文件夹,再简历demo文件夹,依次类推. [java]基础重拾

【玩转SQLite系列】(一)初识SQLite,重拾sql语句

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53230842 本文出自[DylanAndroid的博客] [玩转SQLite系列](一)初识SQLite,重拾sql语句 SQLite由于是一个轻型的嵌入式的数据库,被应用于Android系统当中.在Android开发中 我们难免会用到SQLite数据库.接下来用一系列的文章来数据一下SQLite数据库. 一.认识SQLite 1.什么是SQLite SQLite,是一款轻型

【重拾】数据结构之一

前言 久违来一发,回来学校也都两周了,想想也该定下来学学点什么了,突然发现以前学的好像都已经忘的差不多了,而且以前学的也学得云里雾里,所以今天我要重拾数据结构. 何为数据结构 数据是描述客观事实的数和字符的集合,人们通常以数据元素作为数据的基本单位,比如52班的每个学生记录都是一个数据元素数据项是具有独立含义的最小数据单位. 数据结构是指所有数据元素已经数据元素之间的关系数据结构包括以下几个方面:    1.数据元素之间的逻辑关系,即数据的逻辑结构,它是数据结构在用户面前呈现的形式    2.数