![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 86
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
C++ mutable、 final及noexcept 关键字
见下面几篇文章。转载 2023-10-23 17:41:36 · 414 阅读 · 0 评论 -
C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
如果派生类重载了基类中的同名函数,则该函数将成为派生类中的虚函数,可以通过调用基类中的函数来实现该函数的功能。例如,如果基类虚函数的返回类型是Base*或Base&,那么派生类中重写的函数的返回类型可以是Derived*或Derived&,其中Derived是Base的子类。:如果基类的虚函数在未来发生改变(例如参数类型或数量的改变),但是派生类中的重写函数没有相应地改变,那么使用了override关键字的函数会在编译时报错,这样可以及时发现并修复问题。:你只能重写基类中的公有和保护的虚函数。转载 2023-10-23 17:32:25 · 605 阅读 · 0 评论 -
C++Lambda表达式简单理解
C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:[捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体}//计算两个值的和//当返回值的类型是确定时,可以忽略返回值//调用。转载 2023-08-31 19:10:17 · 87 阅读 · 0 评论 -
C++智能指针理解
(1)auto_ptr:管理权唯一,释放权唯一存在的问题:当多个智能指针指向同一堆内存时,新智能指针具有管理权,原智能指针指向空,导致原智能指针失效(2)unique_ptr:禁止拷贝和移动来保证所有权唯一unique_ptr存在的问题:(1)不能数据共享;(2)在设计层面保证所有权唯一,但使用时并不能保证(3)shared_ptr:带有引用计数存在的问题:智能指针之间的相互引用问题会导致内存泄漏(4)weak_ptr:不可单独使用,常与强智能指针结合使用,以解决强智能指针相互引用的问题。转载 2023-08-30 20:55:20 · 48 阅读 · 0 评论 -
C++强制类型转换运算符
C++支持四种显示类型转换:static_cast :用于C++中隐式转换,两种不相干的类型不能转换,编译会报错reinterpret_cast:C++非隐式转换,可以支持两种不相干的类型转换,操作危险以上两种等价于C语言风格的转换dynamic_cast:C++独有。用于RTTI中基类和派生类中间相关转化,向上转换本身就是安全的,一般用于安全的向下转换const_cast:用于去除变量或表达式的const属性,用于将const类型转换为非const类型。转载 2023-08-28 11:19:26 · 34 阅读 · 0 评论 -
不要返回局部变量的指针或引用
这是因为,上面的information_1是一个对象,而这里的infomation_2是一个引用,而且还是非常量引用,由于非常量引用的初始值必须为左值,8经过隐式转换之后的对象是个临时变量,非常量引用不能与临时变量进行绑定,所以这句代码是错误的。若是在栈区,函数调用结束,这块空间就被释放了,其对应的局部变量的指针或引用也就紧跟着销毁了,如果此时接收了返回的局部指针或引用并使用的话,会导致未定义问题,存在着一定的风险。所谓的不可以返回局部变量的引用或指针,指的是不能返回局部变量的引用或地址给引用或指针。转载 2023-08-25 21:47:18 · 70 阅读 · 0 评论 -
C++ 成员函数的重载,继承,覆盖和隐藏
编译器只会根据函数的名字来查找,不管参数是什么,如果一个同名的函数在派生类的作用域内没有找到那么再去基类的作用域中寻找。当存在继承关系时,派生类的作用域嵌套在基类的作用域之内,如果一个名字在派生类的作用域内无法找到,编译器会继续到外层的基类作用域中查找该名字的定义。(注意别与重载混合)注意,派生类的作用域位于基类作用域之内,因为类作用域有这种继承嵌套的关系,所以派生类才能像使用自己的成员一样来使用基类的成员。其中(1)(2)是重复定义,故编译不能通过,而(3)与(1)(2)是不同类型的函数,是重载。转载 2023-08-25 17:38:35 · 430 阅读 · 0 评论 -
C++引用深入理解
指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、或分配的内存等,这些内容都可以用来获取地址,进而用指针指向它们。还有一些平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用获取它们的地址了,也就没转载 2023-08-18 20:27:05 · 46 阅读 · 0 评论 -
C++关于引用总结
引用相当于是变量的别名,对引用的操作与对变量直接操作完全一样,因为引用不重新生成洗的呢内存地址,引用与指向的变量内存地址是同一个。虽然不存在局部变量的被动销毁问题,但如果被返回的函数的引用只是作为一个临时变量出现,而没有将其赋值给一个实际的变量,那么就可能造成这个引用所指向的空间(有new分配)无法释放的情况(由于没有具体的变量名,故无法用delete手动释放该内存),从而造成内存泄漏。当const引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量。转载 2023-05-28 22:18:38 · 202 阅读 · 0 评论 -
【转】C++友元函数和友元类(C++ friend关键字)
② 程序将 Student 类的声明和实现分开了,而将 Address 类的声明放在了中间,这是因为编译器从上到下编译代码,show() 函数体中用到了 Address 的成员 province、city、district,如果提前不知道 Address 的具体声明内容,就不能确定 Address 是否拥有该成员(类的声明中指明了类有哪些成员)。友元类中的所有成员函数都是另外一个类的友元函数,可以访问另一类的所有成员,包含public、protected、private 属性的。转载 2023-05-28 14:26:05 · 80 阅读 · 0 评论 -
C++ const成员变量 const成员函数 const对象
非const成员函数可以调用const成员函数,const成员函数不能调用非const成员函数。非const成员函数、const成员函数可以任意访问const成员变量、普通变量。const对象只可以调用const成员函数,非const对象任意调用成员函数。类中的const成员变量。转载 2023-05-28 13:47:04 · 158 阅读 · 0 评论 -
C++静态成员变量和静态成员函数
在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员(包括静态成员变量和静态成员函数)。普通成员变量占用对象的内存,静态成员函数没有 this指针 ,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量。普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。转载 2023-05-28 12:38:12 · 51 阅读 · 0 评论 -
C++文件中编译C代码
对比 C++ 和 C 语言之间的关系。简单的理解,C++ 就是在 C 语言的基础上增加了一些新特性,从大的方面讲,C++ 不仅支持面向过程编程,还支持面向对象编程和泛型编程;从小的方面讲,C++ 还支持命名空间、函数重载、内联函数等。在此基础上,很多读者都存在一个疑问,即在一个项目中,能否既包含 C++ 程序又包含 C 程序呢?换句话说,C++ 和 C 可以进行混合编程吗?要知道,在 C++ 出现之前,很多实用的功能都是用 C 语言开发的,很多底层的库也是用 C 语言编写的。转载 2023-05-27 19:06:42 · 700 阅读 · 0 评论 -
【转】规范使用C++内联函数
在多文件编程中,我们通常将函数的定义放在源文件中,将函数的声明放在头文件中,希望调用函数时,引入对应的头文件即可,我们鼓励这种将函数定义和函数声明分开的做法。函数是一段可以重复使用的代码,它位于虚拟地址空间中的代码区,也占用可执行文件的体积,而内联函数的代码在编译后就被消除了,不存在于虚拟地址空间中,没法重复使用。更为严格地说,内联函数不应该有声明,应该将函数定义放在本应该出现函数声明的地方,这是一种良好的编程风格。内联函数虽然叫做函数,在定义和声明的语法上也和普通函数一样,但它已经失去了函数的本质。转载 2023-05-27 18:25:38 · 114 阅读 · 0 评论 -
C++ new和delete运算符
(6)申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间 后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。由于任何一个对象,其构造函数只调用一次,其析构函数也只调用一次,这样就能保证运行时new和delete操作是一一对应的,也就保证了内存管理的安全性。(5) malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常。//动态申请10个int空间并且初始化.转载 2023-05-27 18:08:07 · 74 阅读 · 0 评论 -
从C到C++中const变化
C++ 中的 const 变量虽然也会占用内存,也能使用获取得它的地址,但是在使用时却更像编译时期的#define;#define也是值替换,可见范围也仅限于当前文件。很多C++教程在对比 const 和 #define 的优缺点时提到,#define 定义的常量仅仅是字符串的替换,不会进行类型检查,而 const 定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define 更安全,所以鼓励大家使用 const 代替 #define。转载 2023-05-27 17:53:25 · 77 阅读 · 0 评论 -
C++中的关键字总结
如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况.class是一般的类类型。struct在C++中是特殊的类类型,声明中仅默认隐式的成员和基类访问限定与class不同(struct是public,class是private)。const表示只读类型(指定类型安全性,保护对象不被意外修改),volatile指定被修饰的对象类型的读操作是副作用(因此读取不能被随便优化合并,适合映射I/O寄存器等)。转载 2023-05-27 17:30:28 · 393 阅读 · 0 评论