C/C++
CherishPrecious
追求技术的道路永无止境。
展开
-
二次分派技术(double dispatch)
二次分派技术的原理 ①分派:根据对象的类型而对方法进行选择,就是分派。静态分派发生在编译时期,分派根据静态类型信息来指定方法,它是一个方法的静态绑定(如方法重载)。动态分派发生在运行时期,是根据接方法所属对象的实际类型来调用方法。动态类型绑定只会体现在方法的调用者身上,而方法的参数类型则会在编译期由编译器决定。 ②单分派:只根据方法所属的对象的实际类型和参数的静态类型来指定调用的方法。...原创 2018-08-04 13:28:51 · 401 阅读 · 0 评论 -
类型转换函数operator Type();
示例代码如下:/*类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int、float、double、char等) 或者 另一个类 类型。其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型*/ #include<iostream>#include<iomanip>#include<string>using n...原创 2018-08-01 09:03:16 · 327 阅读 · 0 评论 -
C++菱形继承
简单菱形继承:#include<iostream>using namespace std; //sizeof(A) = 4;//sizoef(B) = 12(变量a,b共8字节,虚基类表指针4 )//sizeof(C) = 12(变量a,c共8字节,虚基类表指针4 ) //sizeof(D) = 24(24,变量a,b,c,d共16,B的虚基类指针4,C的虚基类指针...原创 2018-08-01 09:06:51 · 240 阅读 · 0 评论 -
C++类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)
dynamic_cast1.dynamic_cast是在运行时检查的,用于在集成体系中进行安全的向下转换downcast(当然也可以向上转换,但没必要,因为可以用虚函数实现), 即:基类指针/引用 -> 派生类指针/引用(如果源和目标没有继承/被继承关系,编译器会报错!)2.dynamic_cast是4个转换中唯一的RTTI操作符,提供运行时类型检查。3.dynamic_cast不...原创 2018-08-01 09:11:11 · 173 阅读 · 0 评论 -
Item1 指针与引用的区别
1、指针可以置空,但不存在指向空值的引用。所以引用首次出现的地方必须初始化,后期使用的时候不用测试它的合法性;string& rs; // 错误,引用必须被初始化string s("xyzzy"); string& rs = s; // 正确,rs 指向 sstring *ps; // 未初始化的指针合法但危险【指针没有这样的限制】 void printDouble...原创 2018-08-15 16:15:52 · 533 阅读 · 0 评论 -
Item2 尽量使用 C++风格的类型转换
C++通过引进四个新的类型转换操作符克服了 C 风格类型转换的缺点, 这四个操作符是,static_cast, const_cast, dynamic_cast, 和 reinterpret_cast。在大多数情况下,对于这些操作符你只需要知道原来你习惯于这样写【(type) expression】而现在你总应该这样写【static_cast<type>(expression)】 ...原创 2018-08-15 16:47:17 · 222 阅读 · 0 评论 -
Item3 不要对数组使用多态
类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码几乎从不如你所愿地那样运行。现在我们定义一个基类和派生类:sizeof(CBase) = 4,sizeof(CDerived) = 8;class CBase{public: ...原创 2018-08-15 17:00:55 · 233 阅读 · 0 评论 -
Item4 避免无用的缺省构造函数
缺省构造函数(指没有参数的构造函数)在 C++语言中是一种让你无中生有的方法。构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象。有时这样的方法是不错的。例如一些行为特性与数字相仿的对象被初始化为空值或不确定的值也是合理的,还有比如链表、哈希表、图等等数据结构也可以被初始化为空容器。 但不是所有的对象都属于上述类型,对于很多对象...原创 2018-08-15 17:25:03 · 304 阅读 · 0 评论 -
Item5 谨慎定义类型转换函数
C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了 C 语言的转换方法,例如允许把 char 隐式转换为 int 和从 short 隐式转换为 double。因此当你把一个 short 值传递给准备接受 double 参数值的函数时,依然可以成功运行。C 中许多这种可怕的转换可能会导致数据的丢失,它们在 C++中依然存在,包括 in...原创 2018-08-15 20:24:50 · 230 阅读 · 0 评论 -
浅谈 C++ 中的 new/delete 和 new[]/delete[]
在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候用它们? 你知道 operator new 和 operator delete 吗? 为什么 new [] 出来的数组有时可以用 delete 释放有时又不行? …如果你对这些问题都有疑问...原创 2018-08-16 10:46:57 · 228 阅读 · 0 评论 -
C语言运算符优先级 详细列表
说明:同一优先级的运算符,运算次序由结合方向所决定。 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 ...原创 2018-09-27 08:55:40 · 151 阅读 · 0 评论 -
C/C++中printf和C++中cout的输出格式
一、 Printf 输出格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项。各项的意义介绍如下:1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示:表示输出类型的格式字符 格式字符意义a 浮点数、十六进制数字和p-计数法(C99)A 浮点数、十六进制数字...原创 2018-09-27 08:57:27 · 1666 阅读 · 0 评论 -
C++重载运算符
#include<iostream>#include<iomanip>#include<string>using namespace std; //重载运算符的意义://复数类:繁琐的调用,冗余的参数列表class CComplex{private: int iReal;//实部 int iImg;//虚部public: CComple...原创 2018-08-01 09:01:58 · 154 阅读 · 0 评论 -
计算成员变量在对象中的偏移
class CFoo{public: int iBar1; int iBar2; int iBar3; }; void main(){ CFoo* pClass = NULL;//此处不需要new一个CFoo对象实例(只读不写) int iFldKey1 = (long)(&(pClass->iBar1)) - (long)(...原创 2018-08-01 09:00:05 · 145 阅读 · 0 评论 -
构造函数的巧用
1:定义一个不能被继承的类 我们可以声明一个辅助的类A,把类A这个类的构造函数声明为私有的,并使得B是A的友元类,且B虚继承A。这样的话别的类就不能继承B了。 假设现在有一个类D继承B,在D初始化的时候会先调用B类的构造函数,但是由于B虚继承A,所以为了防止产生二义性,D必须先调用A的构造函数,由于A的构造函数是私有的不可访问,所以会产生错误,继承会失败。#include...原创 2018-08-04 13:30:51 · 235 阅读 · 0 评论 -
C++重载、重写、隐藏的区别
重载的特点: 1、在同一作用域中 2、函数名相同、参数个数或参数类型不同,返回值可同可不同重载的目的: 重载又称为静态多态,静态绑定,静态决议等。因为要实现重载,所以C++和C的命名方式有所不同。重载主要是为了减轻程序员对函数名的记忆负担,让所有功能相似的函数使用同一名字。 隐藏的特点: 1、在不同作用域中,分别在基类和派生类中 2、隐藏只要求...原创 2018-08-04 13:31:45 · 310 阅读 · 0 评论 -
CString的简单实现
注意事项:1、注意为结尾符‘\0’申请一个字节的空间;2、在拷贝构造函数和赋值函数中,注意使用深拷贝,而不是浅拷贝;3、重载输入、输出运算符;#include<iostream>#include<iomanip>using namespace std; class CString{ friend ostream& operator<...原创 2018-08-04 13:32:41 · 879 阅读 · 0 评论 -
使用内存新主张CopyOnWrite(写时拷贝)
一、什么是写时拷贝技术?写时拷贝技术可以理解为“写的时候才去分配空间”,这实际上是一种拖延战术。举个栗子: 二、写时拷贝技术原理: 写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针...原创 2018-08-04 13:34:35 · 271 阅读 · 0 评论 -
C++11之for循环的新用法
C++使用如下方法遍历一个容器中的所有元素:#include "stdafx.h"#include<iostream>#include<vector> int main(){ std::vector<int> arr; arr.push_back(1); arr.push_back(2); for (auto...原创 2018-08-04 13:36:32 · 196 阅读 · 0 评论 -
C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用:#include "stdafx.h"#include<iostream>// std::cout#include<functional>// std::function void func(void){ std::cout << __FUNCTION__ &l...原创 2018-08-04 13:40:47 · 209 阅读 · 0 评论 -
C++11之lambda表达式
lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。lambda表达式的类型在C++11中被称为“闭包类型”,也可以理解为是一个仿函数(带operator()类),其语法形式如下: [capture] (params) opt -> ret {body;}; capture: 捕获列表; params: 参数...原创 2018-08-04 13:42:50 · 119 阅读 · 0 评论 -
为什么C++11引入了std::ref?
C++本身有引用(&),为什么C++11又引入了std::ref? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。如下例子:#include <functional>#include <iostream> void f(int& n1, int& n2, const int& n3){...原创 2018-08-04 13:44:26 · 368 阅读 · 0 评论 -
std::string类型的值不正确的初始化导致异常
std::string sTst(0);定义的时候因为不正确的初始化导致程序异常!原因:构造函数std::string::string(char* lpszBuff)中可能进行了字符串拷贝操作,因为构造的时候传入了0【NULL】导致程序停止运行!! 新功能抽象导致的服务异常。...原创 2018-08-04 13:45:59 · 876 阅读 · 0 评论 -
图解C++ Vtable
下面给出一个完整的C++代码实例(结合图解,相信大家一定会真正理解多态思想):#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>using namespace std; class A{public: int m_data1;...原创 2018-08-01 08:57:31 · 771 阅读 · 0 评论 -
函数对象
指针!= 句柄(资源表中对应的索引值) 函数指针(LPFN)!= 函数对象(FunObj):重载运算符() //函数对象的定义 class CFun{public: int operator()(int x){return 2*x;}}; //函数对象的使用 void main() { CFun oFun; cout << ...原创 2018-08-01 08:59:09 · 102 阅读 · 0 评论 -
匈牙利命名法
变量(还包括宏)的命名规则,比较系统和彻底的有 Windows 编程中用到的匈牙利命名法。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。 有关匈牙利命名法的一点有意思的说明...原创 2018-09-27 08:59:21 · 1723 阅读 · 1 评论