C++
文章平均质量分 53
modi000
生命不止,奋斗不息!
展开
-
C++ 中在函数的前面加上static的作用
具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。先看用来修饰变量的时候。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。成员函数是属于类的,而非对象的,也就是所有该类的对象共同拥有这一个成员函数,而不是普通的每个对象各自拥有一个成员函数。转载 2024-04-09 10:13:20 · 257 阅读 · 0 评论 -
指针作为传入传出参数
总结:形参为指针的情况,实参类型一般为指向的数据类型。指针前有const,认为是是传入参数;原创 2024-02-24 23:02:34 · 479 阅读 · 0 评论 -
C++类模板介绍
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/jianglij4321/article/details/114230440。将声明和实现写在同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制。类模板成员函数创建时机在调用阶段,导致分文件编写时候链接不到。提供尾插法和尾删法对数组中的数据进行增加和删除。可以获取数组中当前元素个数和数组的容量。可以通过下标的方式访问数组中的元素。转载 2024-02-22 13:28:50 · 39 阅读 · 0 评论 -
拷贝构造函数的理解
2.当类成员没有指针的时候,使用编译器自带的默认构造函数就可以(浅拷贝即可),当类成员有指针的时候,需要自定义拷贝构造函数,实行深拷贝。1.拷贝构造函数与构造函数类似,当没有自定义拷贝构造函数的时候,编译器会定义一个拷贝构造函数。当类对象没有初始化的时候,通过赋值运算符的形式,也是调用拷贝构造函数。3.拷贝构造函数的参数为引用,不能是值传递,也不能是指针传递,原创 2024-01-29 21:20:07 · 373 阅读 · 0 评论 -
为什么C++中的拷贝构造函数的形参不能使用值或者指针传递?
由上面可见,我们定义一个指针类型的构造函数,但是无论在=定义变量的场景,还是在fun1中使用非引用类型的形参以及非引用类型的实参都没有调用A(const A* tmp)这个构造函数,所以A(const A* tmp)仅仅只是一个自定义的有参构造,并不是拷贝构造。(1)如果使用值传递的话,那么调用拷贝构造函数的时候,首先需要将实参传递给形参,这个传递的时候又要调用拷贝构造函数,这样就会造成无限递归,最后发生栈溢出,但事实上编译器在语法检查上就已经是禁止这种行为的。情况2:(定义一个引用类型的构造函数)转载 2024-01-29 21:02:00 · 217 阅读 · 0 评论 -
new/delete 和malloc/free的区别
小结:C语言中,申请了多个内存空间,也是只用free即可。原创 2023-11-20 22:11:08 · 181 阅读 · 0 评论 -
C++经典面试题100例及答案
虚函数实现的是在基类中通过使用关键字virtual来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态决定该调用哪一个函数,所以实现的是动态的多态性。虚函数是通过虚函数表来实现的,每个对象都有一个虚函数表指针,指向该类的虚函数表。而对象在构造函数中才初始化虚函数表指针,如果构造函数是虚函数,就需要通过虚函数表来调用,但此时对象还没有实例化,也就没有虚函数表指针,无法找到虚函数表,因此构造函数不能是虚函数。因此构造函数没有必要是虚函数。转载 2023-11-06 12:20:41 · 2331 阅读 · 0 评论 -
虚析构函数
2)因为存在多态性,如果父类的析构函数不为虚函数,则会出现问题,所以,为增强程序的鲁棒性,则父类的析构函数中设置为虚函数。发生继承后,子类的成员函数比父类多,所以父类指针无法指向子类的成员变量或者函数。虚析构函数是为了解决父类指针指向子类对象时,释放子类对象的资源时,释放不完全,造成的内存泄漏问题。子类会继承父类对象的所有的成员变量和成员函数(除了构造,析构,拷贝构造和赋值操作运算符)。结论:1)如果是自身的类指针指向自身的类对象,不会出现问题。发生多态的条件是,父类指针或引用指向子类对象,虚函数重写。原创 2023-11-06 12:16:10 · 147 阅读 · 0 评论 -
C++构造函数
/调用的是默认构造函数。原创 2023-11-05 18:53:12 · 58 阅读 · 0 评论 -
C++核心编程---友元
友元生活中你的家有客厅(Public),有你的卧室(Private)客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去但是呢,你也可以允许你的好闺蜜好基友进去。在程序中,有些私有属性 也想让一些特殊的类或者类外特殊的函数访问,需要友元。友元的目的是让一个函数或者类访问另一个类中的私有成员类的主要特点是封装性,即类的私有成员只能被它自己的成员函数访问,类外的函数无法访问类的私有成员。转载 2023-11-05 14:29:30 · 43 阅读 · 0 评论 -
C++中显示调用构造函数和隐式调用构造函数及exciplit的使用
截图来源于C++ primerplus 第六版。原创 2023-10-25 18:01:54 · 567 阅读 · 0 评论 -
构造函数的4种使用方式总结
通过让构造函数创建一个新的临时对象,然后将其内容复制给d,然后程序调用析构函数,以删除该临时对象。我们无法像调用成员函数那样使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的,因此构造函数被用来创建对象,而不能通过对象来调用。如果既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。无参的时候不可以像上面那样隐式地调用构造函数,因为编译器无法区分这是函数的声明还是对象的定义。其功能可以描述为创建一个名为d的Date对象,并将其数据成员初始化为指定的值。转载 2023-10-24 17:18:56 · 258 阅读 · 0 评论 -
【深入理解C++】浅拷贝与深拷贝
编译器默认提供的拷贝是浅拷贝(shallow copy),将一个对象中所有成员变量的值拷贝到另一个对象,如果某个成员变量是个指针,只会拷贝指针中存储的地址值,并不会拷贝指针指向的内存空间,可能会导致堆空间多次 free 的问题。深拷贝和浅拷贝主要是针对类中的指针和动态分配的空间来说的,因为对于指针只是简单的值复制并不能分割开两个对象的关联,任何一个对象对该指针的操作都会影响到另一个对象。深拷贝(deep copy)是将指针类型的成员变量所指向的内存空间拷贝到新的内存空间。对于值类型的成员进行值复制。转载 2023-10-24 16:27:31 · 55 阅读 · 0 评论 -
C++ 运算符重载
本文引用于“C语言中文网”,我整理出来放在博客,方便大家共同学习。所有知识点和代码均已亲测可用,如有疑问,可提出,一起讨论学习。1. C++运算符重载的概念和原理2. C++重载=(C++重载赋值运算符)3. C++深拷贝和浅拷贝(C++深复制和浅复制)4. C++运算符重载为友元函数5. C++实现可变长度的动态数组6. C++重载(C++重载输出运算符和输入运算符)7. C++重载()(强制类型转换运算符)8. C++重载++和--(自增和自减运算符)转载 2023-10-23 16:39:24 · 45 阅读 · 0 评论 -
C++:友元(看这一篇就够了)
需要注意的是,在类外定义,需要在成员函数加上所在类的作用域(转载 2023-10-23 16:06:44 · 46 阅读 · 0 评论 -
C++ 内联函数
来结束自己的生命,从而结束整个程序。使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝,如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数。由于内联函数比较短小,我们通常的做法是省略函数原型,将整个函数定义(包括函数头和函数体)放在本应该提供函数原型的地方。当函数比较复杂时,函数调用的时空开销可以忽略,大部分的 CPU 时间都会花费在执行函数体代码上,所以我们一般是将非常短小的函数声明为内联函数。转载 2023-10-23 14:45:23 · 44 阅读 · 0 评论 -
C++父类指针指向子类对象的实现原理
当定义一个指向子类实例的父类指针的时候,内存中实例化了子类,由于子类继承了父类,因此内存中的子类里包含父类的所有成员。但是如果用子类指针指向父类的话,一旦访问子类特有的方法函数或者成员变量,就会出现非法,因为被子类指针指向的由父类创建的对象,根本没有要访问的那些内容,那些是子类特有的,只有用子类初始化对象时才会有。如果基础类和派生类类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。2.1 没有虚函数的继承。转载 2023-10-23 14:05:09 · 821 阅读 · 1 评论 -
子类对象构造与析构的过程
可以看到,显示构造父类,然后是子类,析构是先析构子类,再是父类。原创 2023-10-17 19:25:53 · 161 阅读 · 0 评论 -
多态和继承的详细理解以及什么是父类指针指向子类对象
当存在继承关系时,父类的引用变量可以引用子类的对象,并且可以根据对象的实际类型调用相应的方法。继承可以形成类的层次结构,通过上溯转型(upcasting),可以将子类对象当作父类对象对待,实现父类的引用指向子类的对象。多态是面向对象编程中的一个重要概念,指的是同一种行为在不同的对象上具有不同的表现形式。多态性是继承的一个重要目标,它通过允许父类的引用变量指向子类的对象,实现了在不同对象上调用同一方法的不同行为。多态提高了代码的灵活性和可扩展性,可以编写通用的代码,适用于多种不同的对象类型。转载 2023-10-17 11:06:40 · 168 阅读 · 0 评论 -
怎么理解C++多态的“父类指针或引用指向子类对象”?
所以用父类指针指向子类时,没有问题,因为父类有的,子类都有,不会出现非法访问问题。但是如果用子类指针指向父类的话,一旦访问子类特有的方法函数或者成员变量,就会出现非法。可以通俗的理解,子类可能含有一些父类没有的成员变量或者方法函数,但是子类肯定继承了父类所有的成员变量和方法函数。虽然父类指针可以指向子类,但是其访问范围还是仅仅局限于父类本身有的数据,那些子类的数据,父类指针是无法访问的。调用时,可以定义父类的指针,然后指向子类的对象,指向哪个对象,便执行其对象的虚函数实现。为什么父类指针可以指向子类?转载 2023-10-17 10:57:16 · 440 阅读 · 0 评论 -
使用Spring AOP实现日志记录
在LogAspect类的方法上,我们使用了Spring AOP的注解,通过指定切点表达式来切入指定的方法。在上述示例中,我们创建了一个简单的Spring MVC控制器,并定义了两个接口:hello()和exception()。通过编写一个切面类,并通过配置文件激活切面,我们可以在需要记录日志的方法上切入相关逻辑,实现日志记录的同时保持代码的整洁性。当我们访问/exception接口时,由于抛出了异常,切面会记录一条异常日志。接下来,让我们来演示如何在实际的代码中应用日志记录切面。转载 2023-09-24 10:36:17 · 208 阅读 · 0 评论 -
函数形参为指针的优势
函数形参设置为指针类型,这样,传递的是实参的地址,而不是将整个实参复制,尤其是当实参很大,比如说是结构体的时候,可以节省效率。传递的指针参数,可以是char* ,也可以是一个类对象指针。例如:func(char * arg);char *p = "string";func(p);例如:func(QString* arg);QString *p = new QString();func(p);...原创 2022-06-09 16:39:47 · 625 阅读 · 0 评论 -
#ifdef的应用
参考该文通常用来做代码注释,可以做选择的注释;而且,因为是预编译,不执行的代码不会被编译,执行文件小。原创 2022-06-09 15:38:19 · 122 阅读 · 0 评论 -
C/C++中常见的#if、if、#ifdef、#if define等区别
条件编译是C语言中预处理部分的内容,它是编译器编译代码时最先处理的部分,条件编译里面有判断语句,比如 #if 、#else 、#elif 及 #endif它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译,如而 if 语句则不然,if 是 C 语言中的关键字,它根据表达式的计算结果来觉定执行那个语句,它里面的每个分支都编译了的, 如作为一个编译“开关”(常用来注释代码),比如:假如编译时,确实满足条件(结果非0时),则生成的程序文件(.exe文件)中不会有执转载 2022-06-09 15:35:23 · 6709 阅读 · 0 评论 -
ifdef的用法
http://blog.21ic.com/user1/2663/archives/2009/65325.html 转载: ifdef的用法_liang890319的博客-CSDN博客_ifdef的用法转载 2022-06-09 15:27:31 · 19939 阅读 · 1 评论 -
使用静态成员实现单例模式
单例 Singleton 是设计模式的一种,特点是只提供唯一一个类的实例,具有全局变量的特点,在任何位置都可以通过接口获取到那个唯一实例;具体运用场景如:C++单例的实现全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private)线程安全禁止赋值和拷贝用户通过接口获取实例:使用 static 类成员函数举例: 转载:使用静态成员实现单例模式_XiaoMingCL的博客-CSDN博客...转载 2022-06-09 14:48:45 · 223 阅读 · 0 评论 -
类的静态成员
关于类的静态成员,我们需要知道以下几点: 类里面static修饰的成员,成为静态类成员。 类的静态成员是该类型的所有对象对象所共享。 (1)类的静态成员是属于类而不属于对象,所以他不是类的单个对象所有。(2)静态成员只存在一个,不像普通的成员,每创建一个对象,就会创建一组普通的成员。(3)静态成员变量的初始化不能在类中,肯定是不能在构造函数中,只能在类外并且在main函数之前,按照这样的格式进行初始化:变量类型 类名::变量名= 值。并且是先初始化再使用。(4)在静态成员函数中不可以使用非静态成员。因为非转载 2022-06-09 14:46:28 · 4613 阅读 · 1 评论 -
C++类中声明一个函数返回值为指向本类的指针的static成员函数——实现Singleton Instance
1、在class_test.h中定义类在头文件class_test.h中定义类ClassTest,声明静态成员函数functest(),函数返回值为指向ClassTest类的指针。2、在class_test.cpp中在class_test.cpp中实例化ClassTest类。如何实例化?static成员和成员函数不属于对象,它是所有类对象共享一份,所以static成员和成员函数必须要在类外进行初始化!总结:functest()里的static局部变量sVar保证在多次通过ClassTe转载 2022-06-07 10:10:52 · 612 阅读 · 0 评论 -
C++静态成员函数
一 点睛与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行默认访问(即在引用数据时不指定对象名)。静态成员函数和非静态成员函数的根本区别:非静态成员函数有this指针,而非静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有转载 2022-06-07 10:06:38 · 697 阅读 · 0 评论 -
指针数组初始化的应用
int *ch[2];情形1:ch[1] = new int;ch[2] = new int;情形2:ch[1] = new int [10];ch[2] = new int [10];总结:指针既可以指向一个普通变量,也可以指向一个数组。原创 2022-02-23 10:38:48 · 401 阅读 · 0 评论 -
C++基础---string类的clear/erase/pop_back
1. string类的clear/erase/pop_back1.1 std::string::clear原型:void clear() noexcept; 说明:将字符串的内容清空,让源字符串成为一个空字符串(长度为0个字符)。 代码示例: #include <iostream>#include <string>using namespace std;int main (){ string str; cout<<"请转载 2021-08-03 16:26:43 · 5720 阅读 · 0 评论 -
C++中substr()函数用法详解
定义substr()是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。——摘自百科词条语法substr(size_type _Off = 0,size_type _Count = npos)一种构造string的方法形式 : s.substr(pos, len)返回值: string,包含s中从pos开始的len个字符的拷贝(pos的默认值是0,len的默认转载 2021-08-03 16:13:00 · 50404 阅读 · 2 评论 -
C++中使用new动态申请的内存最好是对指针进行判断
int *p =NULL;p = new int [10];if(p==NULL) return 0;原因:可能存在申请内存不成功的情况。原创 2021-02-20 10:20:25 · 413 阅读 · 0 评论 -
c语言/c++中指针的动态初始化及释放
提醒:使用指针最容易犯得错误是,没有初始化就直接操作!!!1、指针的初始化/释放1)指针指向一个内存单元 i)c语言:char *ch =(char*)malloc(sizeof(char));free(ch); ii)c++char *ch = new ch;delete ch;2)指针指向一维数组 i)c语言: int N,*p; scanf("%d",&N); p = (int *) m...原创 2021-02-18 21:02:44 · 2086 阅读 · 1 评论 -
c语言中标志位的使用
1、标志位可以在函数内部使用:void CTEST::CTEST(){ m_flag = false; openDB(); }void CTEST::closeDB(){ if(m_flag) //do sth.}void CTEST::openDB(){ //do sth. if(不成功) { m_flag = false; cout<<"fail"; }原创 2020-09-15 23:31:14 · 9675 阅读 · 0 评论 -
c语言/C++中使用指针遇到的坑
先说缺点,编译C语言程序时,程序出现异常退出,好多情况都是因为使用指针出了问题:易错情形一:指针没有初始化,就直接使用struct stu{int age;string name;};struct stu* mm;mm->age = 1;mm->name = "xiaoming";以上未对指针mm进行初始化,就为变量赋值出错,原因:未初始化的指针,没有申请内存空间,故成员变量age,name没有空间存储改正:struct stu{int age;stri原创 2020-09-15 21:37:20 · 755 阅读 · 0 评论 -
C++将线程函数作为类成员函数,并在构造函数中创建线程
我们知道在Qt中可以使用 继承QThread类,然后重载run函数,来启动线程;此外还可以使用另一种方法:线程函数为类成员函数,注意,必须是静态成员函数,pthread_create()函数,传递this指针参数, 线程函数中将形参强转为类指针,此时,可以该指针调用类成员变量了。例如:class MYFUNC{ private: int value; public: MYFUNC(); stati原创 2020-08-19 22:19:18 · 2524 阅读 · 0 评论 -
举例说明指针所占字节数
//定义数据类型class st{private: char name[20]; int age;public: st(); ~st(); void foo(){ qDebug()<<"hello"; }};st::st(){ memset(name,0,sizeof(name)); age = 0 ;}st::~st(){}struct stt{ char name[20].原创 2020-08-16 17:44:56 · 1034 阅读 · 0 评论 -
C++中类占字节数分析
我们知道c语言中的结构体,相当于c++中的类,类中除了成员变量外,还有成员函数//结构体struct st{char name[20];int age;};//类struct st{char name[20];int age;};原创 2020-08-16 17:01:59 · 282 阅读 · 0 评论 -
c语言中指针一定要先进行初始化(结构体指针尤其容易出错)
指针一定要进行初始化,未初始化的指针不能直接使用,结构体指针为例,进行分析:struct stu{int age;char name[3];};struct stu * mm;mm->age=10;mm->name=“ao”;这样写会出问题,因为并没有对指针进行初始化!!!更正:struct stu * mm=new struct stu;mm->age=10;mm->name=“ao”;分析:没有初始化的指针,直接对成员变量进行赋值,成员变量此时在内存原创 2020-08-13 18:02:56 · 4901 阅读 · 0 评论