C++知识点
c++
稚如初靥
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
指针和引用 , 指针空值nullptr
引用和指针1. 引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间, 使用方式和普通变量相同, 当原变量来对待 。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。底层实现: 通过指针来实现,2. 形式: 类型+& + 新名称 = 新值void test(){ int a = 10; int b = -1; // ra引用, 是变量a的别名, a所代表的空间有两个名字, 代表还是原变量本身 int原创 2020-08-08 12:49:01 · 771 阅读 · 1 评论 -
内联函数 , auto关键字, 基于范围的for循环
1. 内联函数:形式: inline + 普通函数定义概念: 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率。特性:inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。inline不建议声明和定义分离,分离会导致原创 2020-08-08 10:45:38 · 396 阅读 · 0 评论 -
命名空间,缺省参数,函数重载
1. 命名空间在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。//1. 普通的命名空间namespace N1{// N1为命名空间的名称 // 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Add(int left, int right){ return left + right原创 2020-08-06 18:01:40 · 179 阅读 · 0 评论 -
函数模板和类模板
模板如何实现一个通用的交换函数呢?使用函数重载虽然可以实现,但是有一下几个不好的地方:重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数代码的可维护性比较低,一个出错可能所有的重载均出错那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?...原创 2020-07-26 20:41:38 · 448 阅读 · 0 评论 -
malloc/free和new/delete的区别 以及 内存泄漏
内存管理常见面试题1. malloc/free和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型malloc申请空间原创 2020-06-13 12:09:27 · 287 阅读 · 0 评论 -
operator new与operator delete函数
operator new与operator delete函数new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间void test4(){ void* ptr1 = operator new(10); // void* ptr2 = new 10; // 说明new不是运算符重载函原创 2020-06-13 11:34:27 · 559 阅读 · 0 评论 -
C++内存管理方式 (new和delete的操作)
C++内存管理方式C语言内存管理方式(malloc, realloc, calloc, free等函数)在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦我们先来看一段代码, 创建自定义对象:class A{public: // 无参构造和全缺省的构造都是默认构造 A(int a = 1, int b = 2, int c = 3) //A(int a, int b, int c) : _a(a) , _b(b) , _c(c){ cout << "A原创 2020-06-12 17:17:16 · 177 阅读 · 0 评论 -
构造函数体赋值和初始化列表的区别
再谈构造函数1 构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day){ // 这只是一个赋值的操作, 并不算初始化 , 因为其可以执行很多次 _year = year; _month = month; _day = day; // 后面还可以写很多次 _year = y; _year = y; }private: int _y原创 2020-06-10 17:10:51 · 877 阅读 · 0 评论 -
C++类的默认成员函数5和6 --- 取地址及const取地址操作符重载成员函数
取地址及const取地址操作符重载这两个默认成员函数一般不用重新定义, 编译器默认会生成。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!...原创 2020-06-10 15:49:56 · 386 阅读 · 0 评论 -
论const成员函数与非const成员函数
const成员函数该函数的操作就是在类的成员函数尾部加一修饰符 " const " , 当我们不想在成员函数内部去修改成员变量时, 可用将其改为const成员函数将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。this指针本身就是一个类类型 const, 表指向不能变; 现在加了const修饰符后, 相当于给前面再加一个const, 表指向和内容都不能变.class Date{原创 2020-06-08 23:00:19 · 578 阅读 · 1 评论 -
日期类的实现(C++)
class Date{public: // 构造函数 Date(int year = 1, int month = 1, int day = 1){ //判断参数是否有效, 如果没有效 则给一个默认值 // 由于天数不好获取, 则给一个函数getMonthday() if (year <= 0 || month <= 0 || month > 12 || day > getMonthDay(year, month)){ cout <<原创 2020-06-03 16:59:24 · 314 阅读 · 0 评论 -
类的默认成员函数4 --- 赋值运算符重载函数
赋值运算符重载前面介绍了运算符重载函数, 这里介绍赋值运算符重载函数, 同样不写的话, 编译器会帮我们自动生成一个, 下面通过这个Date类来说明1. 参数类型:值: 传参发生拷贝, 且不能优化自赋值的逻辑引用:不发生拷贝, 可以优化自赋值的逻辑2. 返回值类型:void: 不能进行连续赋值引用/值: 可以进行连续赋值, 如果是引用,效率更高 return *this;class Date{public: Date(int year = 1900, int month = 1原创 2020-05-29 17:55:37 · 460 阅读 · 0 评论 -
C++运算符重载函数
运算符重载C++为了增强代码的可读性, 让自定义类型可以直接使用运算符计算, 就需要运算符重载, 运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。1. 定义:函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)2. 注意:自定义类型是不能直接使用运算符计算 基本类型可以不能通过连接其他符号来创建新的操作符, 只能是语法支持的:比如operator@就不行原创 2020-05-27 17:13:20 · 682 阅读 · 0 评论 -
类的默认成员函数2 --- 析构函数
析构函数1. 概念前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的?析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。2. 特性析构函数是特殊的成员函数。帮助我们清理资源(不是销毁对象), 资源包括堆上的资源, 打开的文件, 网络连接如果对象是一个局部变量, 编译器会帮我们自动销毁也是编译器自动调用(在对象的生命周期结束时, 编译器自动调用析构函数 完成对资源原创 2020-05-27 15:33:55 · 374 阅读 · 0 评论 -
类的默认成员函数3 --- 拷贝构造
拷贝构造前面我们已经了解到了构造函数, 这里介绍拷贝构造1. 概念在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。那在创建对象时,可否创建一个与一个对象一某一样的新对象呢?构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用拷贝构造 (属于构造函数的一种重载形式) 创建一个和原有已经存在的对象完全一样的新对象2. 特征拷贝构造函数也是特殊的成员函数,其特征如下:当构造函数的参数是一原创 2020-05-26 23:32:51 · 316 阅读 · 0 评论 -
C++类的默认成员函数1 --- 构造函数
C++中类的构造函数类当中有6个默认成员函数 不管我们有没有定义成员函数 都会有这6个默认的成员函数构造函数用来初始化析构函数用来清理拷贝函数是 使用同类对象初始化创建对象赋值重载主要是吧一个对象赋值给另一个对象取地址重载主要是普通对象和const对象取地址, 这两个默认函数很少会自己实现1. 构造函数:作用 : 初始化对象的成员 (相当于这个空间已经有内容了, 构造函数是专门去初始化成员变量的)且构造函数名与类名相同, 无返回值, 可以重载如果不显示定义构造函数, 编译器会自动生原创 2020-05-20 15:40:19 · 297 阅读 · 0 评论 -
this指针
this 指针:1. this指针的存在Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当s1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。当原创 2020-05-20 15:19:36 · 289 阅读 · 0 评论 -
实现对链表的增删查改
实现对链表的增删查改链表链表:逻辑上连续 物理上不连续 不是一条线 而是一环扣一环每一个数据单元中不光有数据 还有指针 指向下一个元素的起始位置一个数据单元包括一个数据和指针, 数据单元不是挨着的, 通过指针连接下一个数据, 都相当于是一个结构体, 所以是逻辑连续, 物理不一定连续的线性表, 一个数据单元是结构体(单向)有8种链表结构常用的有2种:单链表不带头非循环链表( 做底层...原创 2020-03-20 23:15:30 · 345 阅读 · 0 评论 -
实现对顺序表的增删查改
实现对顺序表的增删查改线性表(连续存储)线性表是n个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表, 链表, 栈, 队列, 字符串…线性表在逻辑上是线性结构, 也就是说是连续的一条直线, 但是在物理结构上并不一定是连续的,线性表在物理上存储时, 通常以数组和链式结构的形式存储顺序表(以数组的形式来存放, 一种是定长的(静态顺序表...原创 2020-03-20 23:09:51 · 391 阅读 · 0 评论
分享