C++
文章平均质量分 50
C++有关知识点
@余笙!
hello world!
展开
-
面试官最爱问的特殊类到底是怎么肥四
目录1、请设计一个类,只能在堆上创建对象2、请设计一个类,只能在栈上创建对象3、请设计一个类,不能被拷贝4、请设计一个类,不能被继承5、请设计一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式面试官:请设计一个类...我:然后,我就想到一句话让我康康还有谁跟我一样“死鱼安乐”,扶我起来,我还能学!!1、请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有,防止别人调用拷贝构造在栈上生成对象 提供一个静态成员函数,原创 2021-06-05 12:13:29 · 284 阅读 · 1 评论 -
构造函数可以是虚函数吗?不看看你就亏大了
首先,构造函数是不能为虚函数的调用构造函数后, 才能生成一个对象。 假设构造函数是虚函数, 虚函数存在于虚函数表中, 而去找虚函数表又需要虚函数指针, 而虚函数表指针又存在于对象中, 这样就矛盾了: 都没有生成对象, 哪有什么虚函数表指针呢?那么问题又来了,析构函数可以是虚函数吗?答:可以把基类析构函数定义为虚函数,在调用析构函数时,会根据指向的对象类型到它的虚函数表中找到对应的虚函数,此时找到的是派生类的析构函数,因此调用该析构函数;而调用派生类析构函数之后会再调用基类的析构函数,因此不会导致内原创 2021-06-03 22:12:38 · 7649 阅读 · 6 评论 -
C++——多态
1.多态的概念不同的对象完成某个行为时会产生不同的状态,这种现象称为多态。例如:对于买票这件行为,普通人买的是全价票,而学生买的是半价票class Person{public: virtual void buyTicket() { cout << "普通票" << endl; }};class Student :public Person{public: virtual void buyTicket() { cout << "原创 2021-01-10 22:41:07 · 308 阅读 · 0 评论 -
C++——继承相关概念
1、继承的概念和定义继承是面向对象程序设计使代码可以复用的最重要的手段,继承是类设计层次的复用例如:class person{public: void print() { cout << "name:" << _name << endl; cout << "age:" << _age << endl; }protected: string _name = "peter"; // 姓名 int _ag原创 2020-12-06 14:27:53 · 166 阅读 · 0 评论 -
C++——stack, queue, priority_queue的介绍和模拟实现
1、容器适配器容器适配器是一种设计模式,这种模式是将一个类的接口转换成客户希望的另外一个接口例如:2、deque(双端队列)deque是一种双开口的“连续”空间的数据结构,可以在头尾两端进行插入和删除操作,时间复杂度为O(1)deque并不是真正的连续空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列的实现:指针数组(每一个元素缓冲区的首地址)+缓冲区(每一个缓冲区都是定长的,大小相同)deque的优点:增容代价小,头插头删效原创 2020-11-27 10:37:29 · 218 阅读 · 0 评论 -
C++——vector
一、vector的介绍vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储元素,因此可以采用下标对vector的元素进行访问,它的大小是动态改变的,vector使用动态分配数组来存储它的元素二、vector的使用1、构造函数...原创 2020-11-17 15:00:38 · 109 阅读 · 0 评论 -
C++——string类的模拟实现
1、string的基本概念string是表示字符串的字符串类,所以在模拟实现string类时,我们先定义一个String类class String{public: //成员函数private: //成员变量 char* _ptr; char* _size; char* _capacity;};_ptr表示字符串指针,_size表示字符串大小,_capacity表示容量2、成员函数的实现(1)构造函数String(const char* str = ""){.原创 2020-11-16 20:32:00 · 153 阅读 · 0 评论 -
C++——模板最基本概念
1、泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础模板分为函数模板和类模板2、函数模板格式:template<typename T1, typename T2, ..., typename Tn>返回值类型 函数名(参数列表) {}简单举例:typename是用来定义模板参数的关键字,也可以使用class,不能使用struct代替函数模板它本身不是函数,是编译器使用方式产生特定具体类型函数的模具在编译阶段,.原创 2020-11-03 15:12:33 · 92 阅读 · 0 评论 -
C++——C/C++内存管理
1、C/C++内存分布栈:又叫堆栈,存储非静态局部变量、函数参数、返回值等,栈是向下增长的堆:用于程序运行时动态内存分配,堆是向上增长的内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统调用接口创建共享内存做进程间通信数据段:存储全局数据和静态数据代码段:可执行的代码/只读常量2、C语言中动态内存管理方式(malloc、calloc、realloc和free)malloc:只申请空间,不进行初始化calloc:申请空间+初始化.原创 2020-11-03 14:05:10 · 134 阅读 · 0 评论 -
C++——友元 & 内部类
1. 友元函数友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字举例:class Date{ friend ostream& operator<<(ostream& _cout, const Date& d); friend istream& operator>>(istream& _cin, Date& d);public: Dat.原创 2020-10-30 14:55:26 · 1094 阅读 · 0 评论 -
C++——static类成员
1、概念声明为static的类成员称为类的静态成员,用static修饰的成员变量称为静态成员变量,用static修饰的成员函数称为静态成员函数静态的成员变量一定要在类外进行初始化static成员的访问方式:通过对象访问: 对象 . static成员 或 对象 ->static成员 通过类名访问: 类名 ::static成员 2、特性(1)静态成员为所有类对象所共享,不属于某个具体的实例(2)静态成员变量必须在类外定义,定义时不加sta...原创 2020-10-30 14:36:27 · 270 阅读 · 0 评论 -
C++——构造函数之初始化列表
1、构造函数体赋值构造函数体中的语句只能将其作称为赋初值,而不能称为初始化,因为初始化只能初始化一次,而构造函数体内可以多次赋值2、初始化列表初始化列表是成员变量初始化的地方,初始化列表以一个冒号开始,以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式注意:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始化【引用成员变量、const成员变量、自定义类型成员(该类没有默认构造函数)】原创 2020-10-30 13:24:13 · 585 阅读 · 0 评论 -
C++——拷贝构造函数&赋值运算符重载
1、拷贝构造函数拷贝构造函数也是构造函数,只是它的参数比较特殊:参数是对象拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般用const修饰),在用已经存在的类类型对象创建新对象时由编译器自动调用特征:拷贝构造函数是构造函数的一个重载形式 拷贝构造函数的参数只有一个且必须用引用传参,使用传值方式会引发无穷递归调用class Date{public: Date(int year = 1900, int month = 1, int day = 1) { _year原创 2020-10-30 10:55:12 · 664 阅读 · 0 评论 -
C++——运算符重载
运算符重载是具有特护函数名的函数,它的引入是为了增强代码的可读性函数原型:返回值类型 operator操作符 (参数列表)注意:不能通过连接其他符号来创建新的操作符,比如:operator@ 重载操作符参数不能全为内置类型,必须有一个类类型或者枚举类型的操作数 用于内置类型的操作数,其含义不能改变 作为类成员的重载函数时,其形参看起来比操作数数目少1个成员函数(操作符有一个默认的形参this指针,限定为第一个形参)有如下代码:class Date{public: Date..原创 2020-10-26 22:11:46 · 91 阅读 · 0 评论 -
C++——析构函数
析构函数与构造函数功能相反,析构函数不是完成对象的销毁,对象在销毁的时候回自动调用析构函数,完成类的一些资源清理工作。析构函数是特殊的成员函数,特征为:1.析构函数名是在类前面加上字符~2.无参数无返回值3.一个类有且仅有一个析构函数,若未显示定义,系统会自动生成默认的析构函数4.对象生命周期结束时,C++编译系统自动生成调用析构函数举例:class String{public: String(const char* str = "jack") { _str =原创 2020-10-26 21:07:31 · 145 阅读 · 0 评论 -
C++——构造函数是开空间创建对象还是初始化对象?
1、构造函数的概念有如下代码:class Date{public: void SetDate(int year, int month, int day) { _year = year; _month = month; _day = day; } void PrintDate() { cout << _year << "-" << _month << "-" << _day << endl; }原创 2020-10-20 21:47:16 · 385 阅读 · 0 评论 -
C++——类和对象中的隐藏参数(this指针)
1、this指针的引出#include<iostream>using namespace std;#include<string.h>#pragma warning(disable:4996)class Student{private: char _name[20]; char _gender[3]; int _age;public: void SetStudentInfo(const char* name, const char* gender, int原创 2020-10-04 19:27:38 · 1051 阅读 · 0 评论 -
C++——不可错过的类和对象最基本概念
1、面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数逐步调用解决问题C++是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成(基于面向对象:既有面向对象,也有面向过程,因为C++要兼容C语言)面向对象和面向过程不是一门编程语言,而是一种解决问题的思路,C++中实现面向对象的编程思想,class定义的类是很关键的一步。2、类的引入在C语言中,结构体只能定义变量,不能定义函数在C++中,结构体内不仅可以定义变量,也原创 2020-10-04 18:25:43 · 207 阅读 · 0 评论 -
C++——内联函数还可以用来代替宏?
1、宏宏的优点:宏函数在预处理阶段展开了,减少了函数调用的开销(传参,参数压栈以及栈帧花销)......宏的缺点:宏函数可能会存在一定的副作用;在预处理阶段进行替换,不会参与编译,少了类型检测;宏函数不能调试......在C++中,宏常量可以用const修饰的常量来代替,宏函数可以用内联函数来代替2、const修饰的变量在C语言中,const修饰的变量不能成为常量,只能称为不能被修改的变量在C++中,被const修饰的变量称为常量,且有宏替换的功能被const修饰的变量的替换发生原创 2020-09-28 22:47:47 · 885 阅读 · 0 评论 -
C++——用引用还是用指针?他们有什么区别
1、引用概念引用不是新定义一个变量,而是给已经存在的变量取了一个别名,编译器不会为引用的变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用:类型& 引用变量名(对象名) = 引用实体;有如下代码:#include<iostream>using namespace std;void TestFun(){ int a = 10; int& ra = a; printf("%d\n", a); printf("%d\n", ra); p...原创 2020-09-28 20:38:57 · 1421 阅读 · 0 评论 -
C++——缺省参数是怎样输出的?
1、缺省参数的概念缺省参数是声明或定义函数时为函数的参数指定一个默认值,在调用函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。在Test()中,没有指定实参则采用Test函数指定的值——0;在Test(10)中,指定了实参则采用指定的值——102、缺省参数的分类(1)全缺省参数:每个参数都带有默认值(2)半缺省参数:部分参数带有默认值注意:1.半缺省参数必须从右向左依次给出,不能间隔着给2.缺省参数不能在函数声明和定义中同时给出3.缺省值必须是常原创 2020-09-24 20:55:29 · 418 阅读 · 0 评论 -
C++——函数重载,为什么C不可以?
一个词可以有多重含义,我们可以根据上下文判断该词的镇长含义,即该词被重载了1、函数重载的概念原创 2020-09-28 09:39:57 · 320 阅读 · 0 评论 -
C++——命名空间,你了解多少?
1、命名空间在C/C++中,变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。namespace关键字的出现就是针对这种问题的。使用命名空间的目的:对标识符的名称进行本地化,以避免命名冲突或名字污染2、命名空间定义定义命名空间需要用到namespace关键字,后面会跟命名空间的名字,然后接一对{},{}中的内容就是命名空间的成员(1)普通的命名空间既可以定义变量,也可以定义函数namespace N1 //N1为命名空间的名称{ //命名空间中的内容,既可原创 2020-09-24 20:14:57 · 200 阅读 · 0 评论