![](https://img-blog.csdnimg.cn/20210120123643176.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
本人学习C++的个人笔记以及一些理解
XiaoMingCL
怕什么真理无穷,进一步有近一步的欢喜!
展开
-
const修饰成员函数和对象
const 修饰成员函数成员函数后加const后我们称这个函数为常函数,它不可以修改成员属性, 关键字 mutable 修饰的成员属性例外常函数表明自己不会对这个对象的数据成员(准确地说是非静态数据成员)作任何改变。 Hello(void)const;const 修饰对象:声明对象前加 const 称该对象为常对象常对象只能调用常函数。例如:class A{public: void myfunc(void) const //const修饰成员函数,常函数 .原创 2021-04-08 17:36:44 · 237 阅读 · 0 评论 -
C++ this指针
C++的封装性:将数据和方法封装在一起,数据和方法分开存储,方法是共享的。在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。(系统自动传入对象的地址,以区别不同对象)友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。使用:1.形参同名 void Hello(int i) { this->i = i; cout原创 2021-04-08 17:27:57 · 71 阅读 · 0 评论 -
使用静态成员实现单例模式
单例 Singleton 是设计模式的一种,特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;具体运用场景如:设备管理器,系统中可能有多个设备,但是只有一个设备管理器,用于管理设备驱动;数据池,用来缓存数据的数据结构,需要在一处写,多处读取或者多处写,多处读取;C++单例的实现全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private)线程安全禁止赋值和拷贝用户通过接口获取实例:使用 static 类成原创 2021-04-08 17:24:45 · 312 阅读 · 0 评论 -
C++静态成员及const修饰静态成员
使用 static 关键字来把类成员定义为静态的。这里所说的静态成员包括静态成员变量和静态成员函数。这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为 0。静态成员在类中声明,在类外定义和初始化。在类外使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化。静态变量在对象还没有创建时就已经分配了空间,不占类空间 。//举例class cla{public:原创 2021-04-08 15:52:19 · 967 阅读 · 0 评论 -
delete不要释放类空指针
类指针类型如果为空, delete 释放空间,则不会执行析构函数。系统根据指针类型进行相应操作,void是空类型,无法从中寻找析构函数,因此不会调用析构函数。#include <iostream>using namespace std;class A{public: A() { cout << "构造函数" << endl; } ~A() { cout << "执行析构" &原创 2021-04-08 15:27:39 · 518 阅读 · 0 评论 -
C++ 动态对象创建 对象数组
首先说说内存申请函数:malloc、calloc、realloc返回一个 void 指针,C++不允许将 void 指针赋值给其他任何指针,必须强转。malloc、calloc、realloc可能申请内存失败,所以必须根据返回值确定是否申请成功。malloc、calloc、realloc不会调用构造函数 ,free释放堆区不会调用析构函数(重要)。C++提供了另外的申请内存空间的关键字:newnew 与 malloc函数相比,其主要的优点是, new 不只是分配了内存,它还创建了对象。new原创 2021-03-27 21:14:36 · 3088 阅读 · 0 评论 -
C++ explicit关键字
explicit 关键字只能用于修饰只有一个参数(或除了第一参数外,其他参数都有默认值的多参)的构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的,禁止通过构造函数进行隐式转换,声明为explicit的构造函数不能在隐式转换中使用。跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。需要注意点是,该关键字修饰的构造函数禁止的是进行隐式转换而不是禁止隐式调用,因此被explicit 修饰的构造函数可以隐式调用。隐式调用、显示调用举例:原创 2021-03-27 20:53:14 · 55 阅读 · 0 评论 -
C++初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。//形式: Point::Point(int x_, int y_): x(x_), y(y_) //x_,y_为类构造函数的形式参数,x,y为类的成员变量 { }用处:除了性能问题之外,有些时候合初始化列表是不可或缺的,以下几种情况时必须使用初始化列表 1.需要初始化const修饰的类成员或初始化引用成员数据,这些都是需要定义的同时赋值的,一定初始化完成,就不能更改。 2原创 2021-03-27 20:33:48 · 99 阅读 · 0 评论 -
C++深拷贝和浅拷贝
浅拷贝:两个对象指针指向同一个区域,(析构)类中有指针成员时,容易造成重复释放空间。因为存在指针成员时,浅拷贝直接将指针的值赋值给另一对象的同名成员变量。为了解决这个问题,需要定义类的拷贝构造函数,进行深拷贝。例如: Point::Point(const Point& p) { //独立申请空间(malloc、calloc、realloc、new) this->ptr=new char; *this->ptr=*p.ptr; }深拷贝:不原创 2021-03-17 22:50:47 · 152 阅读 · 0 评论 -
C++构造函数和析构函数
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行,名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void 。构造函数可用于为某些成员变量设置初始值。可重载。类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行,名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。析构函数的调用时机: 1.对象生命周期结束,自动销毁;(如对象作为参数进行原创 2021-02-08 11:45:07 · 85 阅读 · 0 评论 -
C++类概念、大小及声明定义
类的概念类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。 定义一个类,本质上是定义一个数据类型的蓝图。它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。 类访问修饰符 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 privat原创 2021-02-08 11:15:57 · 449 阅读 · 0 评论 -
C++与C混合编程
#if __cplusplusextern "C" { #endif void add_(int a, int b); /*要使用C编译器编译的函数*/#if __cplusplus }#endif因为C的编译器不支持 extern “C” 语法。这里要引出一个宏, __cplusplus, 只要是C++文件, 编译器就会自动定义一个这样的宏,使用该宏就能达到C++和C混编译的目的。extern “C” 中的C不是指C语言这一门语言, 而是表示一种编译和链接的规约. C表原创 2021-01-29 17:33:33 · 242 阅读 · 0 评论 -
c++函数重载(多态特性)
在同一个作用域内,可以声明几个功能类似的同名函数, 但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。不能仅通过返回类型的不同来重载函数。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。 void print(int a ) void print(int a, int b = 15) {原创 2021-01-29 17:26:14 · 236 阅读 · 0 评论 -
C++函数的默认参数和占位参数
默认参数参数的默认值,当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。默认参数后的所有参数都必须设置默认值。函数声明和函数定义分开写时:不能同时设置默认参数; 分文件时,定义处的默认参数无效,仅声明处设置有效。示例: int sum(int a, int b=20, int c=20) { int result; result = a + b + c; return (result);原创 2021-01-25 14:10:24 · 388 阅读 · 1 评论 -
内联函数
使用内联函数的目的:为了克服宏函数即宏的缺点 (宏的缺点是没有作用域概念,无法进行参数检查,只是单纯的替换)。内联函数 继承了 宏函数的效率,没有函数调用(出入栈的开销)的开销,可以进行参数传递、返回值类型的安全检查,又可以作为类的成员函数。C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译使用该函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果已定义原创 2021-01-25 14:08:17 · 140 阅读 · 0 评论 -
C++中的引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。(必须初始化),不占空间,不开辟空间,引用和被引用变量拥有相同的地址引用一旦初始化,就不能修改指向举例: int i = 17; int& r = i; 定义并初始化引用变量( r 完全等价于 i )对数组的引用示例: int a[5] = {10, 15, 30, 12, 80}; 用 typedef 定义数组类型 t原创 2021-01-21 20:18:26 · 67 阅读 · 0 评论 -
C++相对于C的增强
1.C++更严格的语法、更严格的类型转换更严格的语法:C语言中 int a=0; 赋值当作定义int a; 未赋值当作声明这在C++中 冲突更严格的类型转换:C++不同类型的变量一般不能直接赋值,需要相应的强制转换新增 bool 类型,有 true 、 false,一个字节2.struct类型增强:C++中定义结构体变量不必加 struct 且可以定义成员函数struct A{ int a = 10; char b[32]; void func(vo原创 2021-01-21 20:08:27 · 136 阅读 · 0 评论 -
namespace及using namaspace
1.2 namespacenamespace的作用是是解决命名冲突,是可嵌套的,开放的,只能在全局范围内定义开放的体现在可随时加入新的成员形式: namespace 标识符{ 变量(函数)... }引用: 标识符 :: 变量(函数) ::是作用域命名空间内部声明函数,外部定义 namespace A { void print(void);}void A::print(void){ cout<<"hel原创 2021-01-20 13:44:27 · 433 阅读 · 0 评论 -
C++概念
第一章1.1 C++概念C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。C语言中的弱语法无法在C++中使用 namespace 是指标识符的各种可见范围,是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。区别:C面向过程:核心思想:功能分解、自顶向下、逐层细化;C++: 对象:算法+数据结构 程序:对象原创 2021-01-20 12:48:31 · 291 阅读 · 0 评论