![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CPlusPlus(面向对象)
骑在木马上的黑客
纵有疾风起,人生不言弃!
展开
-
C++重载运算符
#include<iostream>#include<iomanip>#include<string>using namespace std;//重载运算符的意义://复数类:繁琐的调用,冗余的参数列表class CComplex{private: int iReal;//实部 int iImg;//虚部public: CComplex(...原创 2018-04-15 09:59:06 · 223 阅读 · 0 评论 -
C++重载、重写、隐藏的区别
重载的特点: 1、在同一作用域中 2、函数名相同、参数个数或参数类型不同,返回值可同可不同重载的目的: 重载又称为静态多态,静态绑定,静态决议等。因为要实现重载,所以C++和C的命名方式有所不同。重载主要是为了减轻程序员对函数名的记忆负担,让所有功能相似的函数使用同一名字。隐藏的特点: 1、在不同作用域中,分别在基类和派生类中 2、隐藏...原创 2018-04-24 09:07:53 · 236 阅读 · 0 评论 -
CString的简单实现
注意事项:1、注意为结尾符‘\0’申请一个字节的空间;2、在拷贝构造函数和赋值函数中,注意使用深拷贝,而不是浅拷贝;3、重载输入、输出运算符;#include<iostream>#include<iomanip>using namespace std;class CString{ friend ostream& operator<<(ostre...原创 2018-04-24 09:35:23 · 326 阅读 · 0 评论 -
C++类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)
dynamic_cast1.dynamic_cast是在运行时检查的,用于在集成体系中进行安全的向下转换downcast(当然也可以向上转换,但没必要,因为可以用虚函数实现) 即:基类指针/引用 -> 派生类指针/引用 如果源和目标没有继承/被继承关系,编译器会报错!2.dynamic_cast是4个转换中唯一的RTTI操作符,提供运行时类型检查。3.dynamic_cast不是强制...原创 2018-04-21 22:18:48 · 153 阅读 · 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 it = arr.b...原创 2018-05-06 09:16:44 · 4677 阅读 · 1 评论 -
C++11之std::function和std::bind
std::function是可调用对象的包装器,它最重要的功能是实现延时调用:#include "stdafx.h"#include<iostream>// std::cout#include<functional>// std::functionvoid func(void){ std::cout << __FUNCTION__ <&...原创 2018-05-06 09:21:21 · 286 阅读 · 0 评论 -
C++11之lambda表达式
lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。lambda表达式的类型在C++11中被称为“闭包类型”,也可以理解为是一个仿函数(带operator()类),其语法形式如下: [capture] (params) opt -> ret {body;}; capture: 捕获列表; params: 参数列表; o...原创 2018-05-06 09:44:37 · 180 阅读 · 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-05-06 09:50:19 · 868 阅读 · 0 评论 -
C++11之std::future和std::promise
为什么C++11引入std::future和std::promise?C++11创建了线程以后,我们不能直接从thread.join()得到结果,必须定义一个变量,在线程执行时,对这个变量赋值,然后执行join(),过程相对繁琐。 thread库提供了future用来访问异步操作的结果。std::promise用来包装一个值将数据和future绑定起来,为获取线程函数中的某个值提供便利,取值是间...原创 2018-05-06 10:11:28 · 380 阅读 · 0 评论 -
构造函数的巧用
1:定义一个不能被继承的类 我们可以声明一个辅助的类A,把类A这个类的构造函数声明为私有的,并使得B是A的友元类,且B虚继承A。这样的话别的类就不能继承B了。 假设现在有一个类D继承B,在D初始化的时候会先调用B类的构造函数,但是由于B虚继承A,所以为了防止产生二义性,D必须先调用A的构造函数,由于A的构造函数是私有的不可访问,所以会产生错误,继承会失败。//源码#include<...原创 2018-04-24 08:52:45 · 179 阅读 · 0 评论 -
计算成员变量在对象中的偏移
class CFoo{public: int iBar1; int iBar2; int iBar3;};void main(){ CFoo* pClass = NULL;//此处不需要new一个CFoo对象实例(只读不写) int iFldKey1 = (long)(&(pClass->iBar1)) - (long)(pCla...原创 2018-04-13 16:56:00 · 409 阅读 · 0 评论 -
函数对象
指针!= 句柄(资源表中对应的索引值)函数指针(LPFN)!= 函数对象(FunObj):重载运算符()//函数对象的定义class CFun{public: int operator()(int x){return 2*x;}};//函数对象的使用void main(){ CFun oFun; cout << "FunObj : " <...原创 2018-04-13 16:48:10 · 93 阅读 · 0 评论 -
类型转换函数operator Type();
/*类型转换函数能够实现把一个类 类型 转换成 基本数据类型(int、float、double、char等) 或者 另一个类 类型。其定义形式如下,注意不能有返回值,不能有参数,只能返回要转换的数据类型*/#include<iostream>#include<iomanip>#include<string>using namespace std...原创 2018-04-15 10:02:18 · 1777 阅读 · 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的虚基类指针)class A{...原创 2018-04-16 12:24:16 · 158 阅读 · 0 评论 -
C++复杂菱形继承
#include<iostream>using namespace std;//virtual继承基类的好处://1、避免保留基类的多个拷贝;//2、避免二义性//顶层(第一层)class CBase{public: CBase() : iFoo(1){} virtual void Fun1(){cout << "CBase::Fun1"...原创 2018-04-16 12:29:05 · 163 阅读 · 0 评论 -
二次分派技术(double dispatch)
二次分派技术的原理 ①分派:根据对象的类型而对方法进行选择,就是分派。静态分派发生在编译时期,分派根据静态类型信息来指定方法,它是一个方法的静态绑定(如方法重载)。动态分派发生在运行时期,是根据接方法所属对象的实际类型来调用方法。动态类型绑定只会体现在方法的调用者身上,而方法的参数类型则会在编译期由编译器决定。 ②单分派:只根据方法所属的对象的实际类型和参数的静态类型来指定调用的方法。 ③多...原创 2018-04-23 12:08:24 · 531 阅读 · 0 评论 -
图解C++ Vtable
下面给出一个完整的C++代码实例(结合图解,相信大家一定会真正理解多态思想):#include<stdio.h>#include<stdlib.h>#include<iostream>#include<iomanip>using namespace std;class A{public: int m_data1; i...原创 2016-09-03 14:01:37 · 627 阅读 · 0 评论 -
使用内存新主张CopyOnWrite(写时拷贝)
一、什么是写时拷贝技术?写时拷贝技术可以理解为“写的时候才去分配空间”,这实际上是一种拖延战术。举个栗子:二、写时拷贝技术原理: 写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为...原创 2018-04-19 12:48:45 · 404 阅读 · 0 评论 -
std::string类型的值不正确的初始化导致异常
std::string sTst(0);定义的时候因为不正确的初始化导致程序异常!原因:构造函数std::string::string(char* lpszBuff)中可能进行了字符串拷贝操作,因为构造的时候传入了0【NULL】导致程序停止运行!!...原创 2018-07-05 22:11:32 · 1544 阅读 · 0 评论