C++
独L无二
一位颇为清高的女程序媛
展开
-
纯虚析构函数必须给出定义
Effective C++ 条歀07:为多态基类声明virtual析构函数(Declare destructors virtual in polymorphic base classes)纯虚函数纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。虚函数是C++语言的精髓。含有纯虚函数的类被称为抽象类,不能被实例化生成对象,只能派生。由它派生的类的纯虚函数如果没有被实现,那么,该派生类还是个抽象转载 2022-01-07 10:01:23 · 641 阅读 · 0 评论 -
The rule of three/five/zero
https://en.cppreference.com/w/cpp/language/rule_of_threeRule of threeIf a class requires a user-defined destructor, a user-defined copy constructor, or a user-defined copy assignment operator, it almost certainly requires all three.Because C++ copies转载 2020-12-05 21:25:57 · 684 阅读 · 0 评论 -
二进制乘法运算
在回答本问题之前,先学习一些有关位运算的知识。(1) 常用的等式: -n=~(n-1)=~n+1(2) 获取整数n的二进制中最后一个1: n&~(n-1)或者n&(-n)。例如n=010100,则-n=101100,n&(-n)=000100。(3) 去掉整数n的二进制中最后一个1: n&(n-1)。例如n=010100,n-1=010011,则n&(n-1)=010000。注:对n为正数或者负数都适用。先看一个实例:1011*1010,因为二进制转载 2020-09-23 14:01:35 · 8657 阅读 · 0 评论 -
数组指针和指针数组的区别
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]p++; //该语句执行过后,也就...转载 2020-09-22 15:53:56 · 370 阅读 · 0 评论 -
智能指针源码解析
从源码理解智能指针(一)——auto_ptr、unique_ptr从源码理解智能指针(二)—— shared_ptr、weak_ptr转载 2020-09-17 09:43:31 · 1165 阅读 · 0 评论 -
不用中间变量交换两个变量的方法
面试中经常会出现的问题,主要针对整数类型,有两种解法:数值运算法void swap(int &A, int &B){ A = A + B; B = A - B; A = A - B;}从理解的角度来说,假如A'和B'代表交互以后的值,那么按照以上运算规则就有:A'=A+B; B'=A'-B=A+B-B=A; A'=A'-B'=A+B-A=B;最后运算的结果就变成了A'=B;B'=A;这样就完成了交换。异或运算法void swap(int &原创 2020-08-07 09:47:31 · 424 阅读 · 0 评论 -
侵入式容器 Boost.Intrusive
Boost.Intrusive 是一个很有意思的实现,里面实现了很多侵入式容器,在特定环境下,可以大大提升性能。首先我们得理解什么是侵入式,什么是非侵入式。普遍,我们认为std的容器,比如std::list都是非侵入式的。这是因为对于任何一个(支持复制或者移动的)类型T,我们都可以定义std::list<T>。当往std::list里插入一个元素时,它会分配一个节点,这个节点的结构类似于下面这个:struct Node { T data; Node* prev;转载 2020-09-13 20:29:54 · 2429 阅读 · 0 评论 -
C++ Performance Tips
C++ Performance TipsTable of ContentsIntroduction Constructors and Destructors Virtual Functions Return Value Temporaries InliningIntroductionThese tips are based mainly on ideas from the book Efficient C++ by Dov Bulka and David Mayhew. For a转载 2020-09-13 20:26:48 · 216 阅读 · 0 评论 -
C++的静态分发(CRTP)和动态分发(虚函数多态)的比较
虚函数是C++实现多态的工具,在运行时根据虚表决定调用合适的函数。这被称作动态分发。虚函数很好的实现了多态的要求,但是在运行时引入了一些开销,包括:对每一个虚函数的调用都需要额外的指针寻址 虚函数通常不能被inline,当虚函数都是小函数时会有比较大的性能损失 每个对象都需要有一个额外的指针指向虚表所以如果是一个对性能要求非常严格的场合,我们就需要用别的方式来实现分发,这就是今天这篇博客的主角CRTP。CRTP通过模板实现了静态分发,会带来很多性能的好处。可以参见The cost of dyn转载 2020-09-13 20:25:35 · 1222 阅读 · 0 评论 -
字符数组与字符指针的区别
1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句:char *str = "This is a string.";是对字符指针进行初始化。此时,字符指针指向的是一个字符串常量的首地址,即指向字符串的首地址。这里要注意字符指针与字符数组之间的区别。例如,有说明语句:char string[ ]="This is a string.";此时,string是字符数组,它存放了一个字符串。字符指针str与字符数组string的区别是:str是.转载 2020-09-09 11:39:33 · 6433 阅读 · 2 评论 -
类成员变量可以是引用类型的么?
今天面试,面试官问我类的成员变量可以试引用类型的么?我回答yes。面试官:那怎么初始化呢?我:呃回来一试,确实可以,只不过不能用默认构造,必须带引用类型的构造函数完成初始化过程,而且一定要用初始化列表的形式完成初始化class Widget{public: // 构造函数形参为传值,不能保证正确性 //error: call to constructor of 'Ref' is ambiguous Widget (int target) :myref(tar原创 2020-09-01 19:29:43 · 2737 阅读 · 2 评论 -
C++异常机制
C++异常机制详解深入理解C++异常机制【C++】异常处理机制深度剖析原创 2020-08-28 20:56:34 · 124 阅读 · 0 评论 -
C++构造函数、析构函数与抛出异常么?
从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(1)构造函数可以抛出异常无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。new运算符保证不会出现内存泄漏:T *p = new T;将被编译器转换给类似下面的样子: void allocate_and_cons.转载 2020-08-28 13:35:00 · 161 阅读 · 0 评论 -
C++常见面试题(转)
https://www.cnblogs.com/inception6-lxc/p/9244194.html原创 2020-08-28 12:35:07 · 91 阅读 · 0 评论 -
virtual 函数可以是private么?
答案是yes!这恰好是NVI的实现方式。。。什么是NVI?non-virtual interface(NVI):令用户通过public non-virtual成员函数间接调用private virtual函数,将这个non-virtual函数称为virtual函数的wrapper。wrapper确保得以在一个virtual函数被调用之前设定好适当场景,并在调用结束之后清理场景(也即是设计模式中的模版方法)。注意此时用指针或引用调用该non-virtual成员函数时,该non-virtual成员函原创 2020-08-22 21:30:04 · 1048 阅读 · 0 评论 -
sizeof()大小总结
sizeof 运算符查询对象或类型的大小在需要知道对象的实际大小时使用语法:sizeof(类型) sizeof 表达式解释返回 类型 的对象表示的字节数。 返回当 表达式 求值时所返回的类型的对象表示的字节数。#include <iostream>class A{};int main(){ A a; std::cout<< sizeof a <<endl; //OK 1 //std::cout<< sizeo转载 2020-08-14 13:37:47 · 5336 阅读 · 1 评论 -
.lib和.dll的区别和使用
共有两种库:1.一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。2.一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。共有两种链接方式:1.动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。2.静态链接使用静态链接库,链接器从静态链接库转载 2020-08-14 12:35:41 · 343 阅读 · 0 评论 -
面试中经常考到的MyString class的实现
头文件实现:#ifndef STRINGCLASS_MYNEWSTRING_H#define STRINGCLASS_MYNEWSTRING_H#include <iosfwd>class MyNewString {public: MyNewString(char* pData = nullptr); ~MyNewString(); MyNewString(const MyNewString& src); MyNewString&原创 2020-08-12 21:32:40 · 199 阅读 · 0 评论 -
虚函数和虚函数表
多态是由虚函数实现的,而虚函数主要是通过虚函数表(V-Table)来实现的。如果一个类中包含虚函数(virtual修饰的函数),那么这个类就会包含一张虚函数表,虚函数表存储的每一项是一个虚函数的地址。如下图:这个类的每一个对象都会包含一个虚指针(虚指针存在于对象实例地址的最前面,保证虚函数表有最高的性能),这个虚指针指向虚函数表。注:对象不包含虚函数表,只有虚指针,类才包含虚函数表,派生类会生成一个兼容基类的虚函数表。原始基类的虚函数表 下图是原始基类的对象,可以看到虚指针在地址的最转载 2020-08-12 18:01:07 · 1002 阅读 · 0 评论 -
C++和Java的区别和联系
通常,我们聊到Java,第一印象“面向对象”,“没有指针,编写效率高,执行效率较低”。更深入、专业一点就谈论 “java内存自动回收(GC垃圾回收机制),多线程编程”。**java的三大特性是封装、继承和多态。**总结如下:1、JAVA的应用在高层,C++在中间件和底层2、 JAVA离不开业务逻辑,而C++可以离开业务为JAVA们服务3、 java语言给开发人员提供了更为简洁的语法;取消了指针带来更高的代码质量;完全面向对象,独特的运行机制是其具有天然的可移植性。4、 java 是..转载 2020-08-04 09:42:36 · 1448 阅读 · 0 评论 -
C/C++ 中 int float double 最大值,最小值
https://blog.csdn.net/ACb0y/article/details/5336822#include <iostream>#include <float.h>using namespace std;int main(){ cout << "int 类型能存储的最大值和最小值" << endl; cout &...转载 2019-05-23 12:07:29 · 37468 阅读 · 3 评论 -
C++中有了malloc / free , 为什么还需要 new / delete
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于mall...原创 2019-08-19 15:44:53 · 266 阅读 · 0 评论 -
[转]C与C++的区别
https://www.zhihu.com/question/28834538作者:匿名用户链接:https://www.zhihu.com/question/28834538/answer/370975653来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。1、首先C和C++在基础语句上没有太大区别。我想学过几门编程语言的都有过这种体会,主...原创 2019-08-19 15:02:59 · 132 阅读 · 0 评论