C++
文章平均质量分 78
Y~哈哈哈
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
如何实现一个不可以被继承的类
由于派生类对象的构造,要先构造基类部分,而且派生类可以继承基类的private成员,但是却不能访问,因此可以把基类的构造函数实现成private私有的构造函数,那么任何一个派生类在继承这个基类的时候,都会由于无法调用基类的私有构造函数,而导致这个基类不能被任何派生类继承...原创 2019-05-15 17:55:53 · 397 阅读 · 0 评论 -
C++函数重载实现的机制
一、函数重载:在相同作用域内的 具有相同函数名不同参数列表(参数个数、类型、顺序)的函数构成重载二、为什么要用函数重载 在C中,我们对一个功能函数要实现不同类型的调用时,就必须得取不同的名称。如果调用的非常多就要起很多名字,这样就增加了工作量,如果采用函数重载来声明一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处三、C++函数重载是如何...原创 2019-03-30 18:23:34 · 668 阅读 · 0 评论 -
虚函数 多重继承 动态绑定
class A {public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2();private: int m_data1, m_data2;};class B : public A {public: virtual void vfunc1...原创 2019-03-30 18:23:19 · 298 阅读 · 0 评论 -
虚继承 虚基类的子类内存布局
1、普通多继承的内存布局class A{public: int dataA;};class B : public A{public: int dataB;};class C : public A{public: int dataC;};class D : public B, public C{public: int dataD;};B类的内存...原创 2019-03-30 18:20:33 · 615 阅读 · 0 评论 -
const和define的区别以及const的优点
一、const和define的区别(1)就起作用的阶段而言:#define是在编译的预处理阶段起作用(在预处理阶段进行替换),而const是在编译运行的时候起作用(const修饰的只读变量是在编译的时候确定其值)(2)就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。而const有对应的类型,是要进行判断的,可以避免一些低级的错误(3)就存储方式而言:#define...原创 2019-03-30 19:23:15 · 6321 阅读 · 2 评论 -
C++中必须在类初始化列表中初始化的几种情况
一、const类型的成员变量 const对象或引用只能初始化但是不能赋值。构造函数的函数体内只能做赋值而不是初始化,因此初始化const对象或引用的唯一机会是构造函数函数体之前的初始化列表中。从无到有叫初始化,初始化(调用拷贝构造函数)创建了新对象;赋值(调用赋值操作符)没有创建新对象,而是对已有的对象赋值。二、引用类型的成员变量#include <iostream...原创 2019-04-15 10:08:27 · 1747 阅读 · 0 评论 -
重载和重写的区别
一、重载(静多态)同作用域、同名、不同参数列表(类型、个数、类型顺序),返回值是否相同无所谓 对于继承来说,对于某一方法,如果在父类中是private,那么在子类中是不会被重载的,如果定义的话也只是定义了一个新的方法,并没有达到重载的效果 子类无法重载父类的函数,父类同名的函数会被隐藏二、重写(覆盖)(动多态)在子类中定义与父类中 同名、同返回值、同参数列表的函数 只发生在父类与子...原创 2019-04-24 21:16:05 · 286 阅读 · 0 评论 -
C++static关键字的作用
C++中static关键字主要在以下场景中用到一、static修饰全局变量和局部变量 全局变量属于数据,它如果被初始化为0或者不初始化则存放在.bss段,如果初始化不为0,则存放在.data段。如果是字符串常量则存放在.rodata段1、普通全局变量和static全局变量的区别(1) 普通的全局变量经过编译之后会产生一个gloab的符号,在链接阶段其他的.obj文件是可以看...原创 2019-04-24 21:58:16 · 773 阅读 · 0 评论 -
C++中类的初始化列表
这个初始化列表严格来说,应该叫做构造函数的初始化列表,一个对象的完整构造顺序顺序应该是:先按照成员变量的定义顺序依次构造成成员变量,最后再调用当前类的构造函数构造一个新的对象,因此当构造函数调用时,说明成员变量(或者成员对象)早已初始化(或者构造)完成,那么成员变量(或者成员对象)如果没有默认的初始化或者构造方式的话,就在当前类构造函数的初始化列表当中初始化举例:class A{...原创 2019-05-20 15:50:27 · 1625 阅读 · 0 评论 -
普通函数、宏函数、内联函数、静态函数的对比
一、查看普通函数调用时的生成指令的情况,根据下图我们会发现它在进行函数调用的时候产生了很多的指令,所以我们说它的效率低二、查看宏函数在编译的时候生成的指令数宏函数的优点:(1)效率高(在编译的时候生成的指令少)(2)不存在栈帧的开辟、不存在参数的代入、不存在返回值带出、不存在参数的清除宏函数的缺点:(1)不安全,我们知道宏是在预编译的时候就会进行展开的,而在预编译的...原创 2018-11-04 15:25:41 · 772 阅读 · 0 评论 -
如何实现一个类定义的对象不能进行拷贝构造和赋值呢
可以实现一个基类,把这个基类的拷贝构造和operator=赋值函数私有化,那么任何这个基类继承的派生类,都不能拷贝和operator=了还有一种办法:把这个类的拷贝构造和operator=赋值函数私有化,这样做完全可以,但是对于每一个类的进行更改,代码修改量比较大,所以还是建议使用上面的方法...原创 2019-05-15 18:01:31 · 532 阅读 · 0 评论 -
C++this指针干什么用的
class Test{public: void func(){ cout<<"mvalue:"<<mvalue<<endl; }private: int mvalue;};int main(){ Test t1,t2; t1.func(); t2.func(); return...原创 2019-05-15 19:57:17 · 1252 阅读 · 0 评论 -
int *const p和const int *p区别
const int *p;上面这条语句中,const修饰的是p指向的内存的值不能被修改,但是p本身是可以修改的int *const p;上面这条语句中,const修饰的是p本身是常量,不能被修改,但是p指向的内存是可以被修改的下面给出几种错误的类型转换const int *p ==> int *q;int **p ==> const int **q;con...原创 2019-05-15 20:04:48 · 587 阅读 · 0 评论 -
set的底层实现实现为什么不用哈希表而使用红黑树
1、set中元素是经过排序的,红黑树也是有序的,哈希是无序的2、如果只是单纯的查找元素的话,那么肯定要选哈希表了,因为哈希表在的最好查找时间复杂度为O(1),并且如果用到set中那么查找时间复杂度的一直是O(1),因为set中是不允许有元素重复的。而红黑树的查找时间复杂度为O(lgn)...原创 2019-05-15 18:15:01 · 2679 阅读 · 0 评论 -
new和 malloc区别以及delete和free的区别
一、new和malloc的区别其实new的底层也是使用malloc来实现的,只不过在类类型中比malloc多了一个调用构造函数来初始化的功能1、返回值new开辟内存需要指定类型,返回指定类型的指针,因此不需要进行强转 malloc的返回值是一个指针,指向一段可用内存的起始地址。因此malloc的返回值需要强转成指定类型的地址2、内存开辟与初始化malloc只负责开辟内存,内有初...原创 2019-05-11 10:18:18 · 1129 阅读 · 0 评论 -
delete和delete[]的区别以及什么时候用new[]申请可以用delete来释放
一、什么时候用new[]申请,可以用delete释放 1、在C++中,把单个元素的内存开辟释放和数组的内存开辟释放是分开的。因为在C++里面,开辟内存和构造对象是一起发生的,析构对象和释放内存是一起发生的int *a = new int; //delete a 或 delete[] 都可以int *p = new int[]; //delete p 或 delete p[] 都可以...原创 2019-05-11 10:58:10 · 2180 阅读 · 0 评论 -
qsort函数和bsearch函数
头文件<stdlib.h>一、qsort()是用来排序的,原型如下:void qsort(void *base, size_t num, size_t size, int(*compare)(const void*,const void*));void *base:任意类型的数组 size_t size:指数组元素的个数 size_t size:每一个元素的大小 最...原创 2019-05-17 15:33:36 · 536 阅读 · 0 评论 -
int *&n 怎么理解
int *&n 说明n是一个整型指针的别名;代码演示:int main(){ int m = 100; int *d = &m; int *&n = d; cout<<"m = "<<m<<" *d = "<<*d<<" *&n = &q原创 2019-01-11 14:14:39 · 7909 阅读 · 0 评论 -
函数模板
一、函数模板的基本概念函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可用具体的类型(如:int 或double)替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。 函数模板允许以任意类型的方式来定义函数 第3行指出,要建立一个模板,并将类型命名为T,关键字templa...原创 2019-01-02 21:34:04 · 379 阅读 · 0 评论 -
类模板
一、类模板的特点:类模板实例化的时候要加类型参数,而函数模板实例化的时候不用,因为函数模板能自推出类型 类成员方法的模板的特例化不允许在类外使用 #include<iostream>#include<string>#define MAXSIZE 10using namespace std;template<typename T>class ...原创 2019-01-02 21:40:52 · 251 阅读 · 0 评论 -
部分运算符的重载
一、运算符重载 : 它允许将标准C++(如=和+)用于类对象。这种C++机制使得非成员函可以访问私有数据 运算符重载是一种形式的C++多态二、实例“+”运算符的重载(“-"运算符的重载和这个一样,只需把“+”改为“-”就行)class compex{public: compex(int real, int image) :_real(real),_image(image...原创 2018-12-01 17:47:21 · 441 阅读 · 0 评论 -
智能指针
一、什么是智能指针 智能指针是一个类,这个类的构造函数中传入一个指针,析构函数中释放传入的指针。智能指针都是栈上那个的对象,所以当函数(或程序)结束时都会被自动释放。二、为什么要使用智能指针 我们知道C++的内存管理是让人很头疼的事,当我们写一个new语句时,一般就会立即把delete语句也直接写了,但是我们不能避免程序还未执行到delete时就跳转了,或者在函数中没有执行到最...原创 2019-01-04 13:16:24 · 450 阅读 · 0 评论 -
多态
多态分为:静多态和动多态一、静多态:发生在重载、模板、编译时期发生的多态二、动多态:继承的多态、运行时期发生的多态(1)虚函数和指针解引用的关系class Base{public: Base(int a) :_a(a) {} void show() { cout << "Base::void show()" << endl; } ...原创 2019-01-10 23:11:54 · 472 阅读 · 0 评论 -
什么函数能写成虚函数
1、析构函数在什么时候必须写成虚函数 存在基类指针指向堆上的子类对象上2、构造函数能否写成虚函数 不能,虚函数指针是存在在对象的前四个字节上的,那么虚函数的前提就是必须有了对象才能看其它的,而构造函数就是用来产生对象的,所以没有对象是无法调用的。3、内联函数能否写成虚函数 不能,内联函数编译时期在调用点展开,release版本下没有地址,而虚函数表中存的是函数的地址,所以...原创 2019-01-10 23:21:42 · 822 阅读 · 0 评论 -
传指针和传引用的区别以及指针和引用的区别
一、引用:引用的定义:引用是给另外一个变量其别名,所以引用不会分配内存空间,引用是引入了对象的一个同义词。例如:Point pt1(10,10);Point &pt2 = pt1;上述的代码,定义了pt2为pt1的引用。通过这样的定义,pt2和pt1表示同一对象,需要特别注意的是,引用并不产生对象的副本,仅仅是对象的同义词,因此当执行下面的语句之后pt1.of...原创 2019-03-30 18:21:25 · 6782 阅读 · 4 评论 -
C++基础
之前说的都是在栈上申请的内存空间,现在用new讲在堆上的空间开辟定义一个对象的格式:类名 对象名 = new 类名();一、new和malloc的区别new先是在堆上申请内存,后调用构造函数 malloc只在堆上申请空间但是不释放二、delete和free的区别delete先调用析构函数,后释放它 free只释放三、堆上的对象的生命周期 被delete的时候生命周...原创 2018-11-17 16:43:32 · 315 阅读 · 0 评论 -
类与类之间的关系之——继承
一、类与类之间的三大关系(1)组合:一个类是另一个类的一部分class A{ class B {};};(2)代理:一个类的方法是另一个类方法的子集,也就是说这个类它本身是不进行任何的操作,只是调用另一个类来帮它实现它想做的事情。(3)继承:一个类是另一个类的一种class Parent{ };class child : public Parent{...原创 2019-01-07 21:39:32 · 3895 阅读 · 0 评论 -
宏定义和重名名的区别
#define char* CharPtr //本质是进行字符串的替换typedef char* CharPtr; //重命名,CharPtr就是一个类型了const CharPtr a;上面的一段代码如果是在使用宏定义的话,const修饰的是char 使用重命名的话,const修饰的是char *...原创 2019-01-02 21:33:03 · 1236 阅读 · 0 评论 -
继承——菱形继承
一、菱形继承是什么?一个派生类有多个基类,多个基类又由同一个类派生,用下列代码来解释class A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D: public B,public C{public: ...原创 2019-01-18 20:34:07 · 6670 阅读 · 1 评论 -
四种类型转换
C语言支持类型强制转换,C++为什么要引入其他类型转换,原因如下: 1、C风格的转换格式很简单,但是有不少缺点的:(1)转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。(2)C风格的转换没有统一的关键字...原创 2019-01-18 22:06:16 · 2422 阅读 · 0 评论 -
C和C++区别——函数重载
一、从编译链接的角度考虑函数在C和C++中的区别1、C语言中函数生成的符号依靠函数名,所以不允许函数名相同,如果两个函数名相同的函数在同一个文件中,那么在编译的时候就会生成两个相同的符号,将这两个相同的符号存储在符号表中,那么我们在链接的时候到底使用哪一个呢?所以不允许函数名相同2、在C++中,函数生成符号依靠的是函数名+参数列表,所以在函数名相同,参数列表不相同的情况下可以重载。二、...原创 2018-11-04 16:01:33 · 450 阅读 · 0 评论 -
C++中的四种函数——构造函数、拷贝构造函数、赋值函数、析构函数
C++中的权限public和private绝大多数数据成员的声明出现在成员访问说明符private之后,在成员访问说明符private之后声明的变量或者函数,只可以被声明它们的类的成员函数(或者“友元”)所访问。C++中有四种特殊的函数,分别是(1)构造函数(2)拷贝构造函数(3)赋值函数(以“=”为例)(4)析构函数在讲这四种函数之前我们先讨论一下关于this指针在成员方法声明或...原创 2018-11-11 16:22:16 · 1200 阅读 · 0 评论
分享