![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++基础知识
本专栏收录C++基础知识
黑马金牌编程
励精图治的23℃
展开
-
C++构造函数和析构函数基本概念和用法
C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动,完成对象初始化和清理工作。构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调动。因此如果我们不提供构造和析构,编译器会提供,编译器提供的构造函数和析构函数时空实现。4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次。4.程序在调用对象时会自动调用构造,无须手动调用,而且只会调用一次。同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。2.函数名称与类名相同。原创 2023-01-10 22:27:41 · 212 阅读 · 0 评论 -
C/C++内存分配
内存分配不当有什么后果?引起堆栈溢出、缓冲区溢出等问题,容易使得系统瘫痪和崩溃。内存分配形式有哪些?(1)由符号起始的区块(BSS)段:用来存放程序中未初始化的全局数据和静态数据的一块内存区域,BSS段属于静态内存分配,程序结束后静态变量资源由系统自动释放。(2)数据段:用来存放程序中已初始化的全局变量的一块内存区域。也属于静态内存分配。(3)代码段文本段:用来存放程序的执行代码的一块内存区域。区域大小运行前确定,一般允许可读,可以共享。(4)堆:用于存放进程运行中被动态分配的内存段,大小不固定原创 2022-02-17 13:45:21 · 1052 阅读 · 0 评论 -
C++Primer基础部分
C++Primer基础部分extern:声明变量。如果只是想声明一个变量而非定义它,就在变量名前加关键字 extern 。extern int i;//声明i而非定义iextern语句如果包含 初始值就不再是声明了,而是变成了定义。例如:extern double pi=3.14.16;//定义区别:函数声明无需函数体,用一个分号替代即可。复合类型:引用、指针 复合类型是指基于其他类型定义的类型。一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成目前阶段所学,声明符就原创 2021-09-05 09:57:20 · 160 阅读 · 0 评论 -
c++菱形继承
菱形继承菱形继承概念:两个派生类继承同一个基类又有某个类同时继承两个派生类这种继承被称为菱形继承典型的菱形继承案例:菱形继承问题:1.羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。2.草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以了。代码示例:#include <iostream>using namespace std;//动物类class Anima1{public: int原创 2021-09-04 10:23:08 · 217 阅读 · 0 评论 -
C++继承方式
继承方式继承的语法:class 子类:继承方式 父类继承方式一共有三种:公共继承保护继承私有继承代码示例:#include <iostream>using namespace std;//继承方式class Base1{public: int m_A;protected: int m_B;private: int m_C;};//公共继承class Son1 :public Base1{ voi原创 2021-09-04 09:50:12 · 110 阅读 · 0 评论 -
函数调用运算符重载
函数调用运算符重载函数调用运算符()也可以重载由于重载后使用的方式非常像函数的调用,因此称为仿函数仿函数没有固定写法,非常灵活代码示例:#include <iostream>#include <string>using namespace std;//函数调用运算符重载//打印输出类class MyPrint{public: //重载函数调用运算符 void operator()(string test) {原创 2021-09-02 12:26:57 · 196 阅读 · 0 评论 -
关系运算符重载
关系运算符重载作用:重载关系运算符,可以让两个自定义类型对象进行对比操作代码示例:#include <iostream>#include <string>using namespace std;//重载关系运算符class Person{public: Person(string name, int age) { m_Name = name; m_Age = age;原创 2021-08-31 10:42:17 · 425 阅读 · 0 评论 -
赋值运算符重载
赋值运算符重载c++编译器至少给一个类添加4个函数1.默认构造函数(无参,函数体为空)2.默认析构函数(无参,函数体为空)3.默认拷贝构造函数,对属性进行值拷贝4.赋值运算符operator=,对属性进行值拷贝如果类中有属性指向堆区,做赋值操作时也会出现深拷贝问题代码示例:#include <iostream>using namespace std;//赋值运算符重载class Person{public: Person(int age)原创 2021-08-30 10:29:05 · 195 阅读 · 0 评论 -
递增运算符重载
递增运算符重载作用:通过重载递增运算符,实现自己的整形数据代码示例:#include <iostream>using namespace std;//重载递增运算符//自定义整形class MyIntegrer{ friend ostream& operator<<(ostream& cout, MyIntegrer myint);public: MyIntegrer() {原创 2021-08-29 12:36:02 · 296 阅读 · 0 评论 -
左移运算符重载
左移运算符重载作用:可以输出自定义类型代码示例:#include <iostream>using namespace std;//左移运算符重载class Person{ friend ostream & operator<<(ostream &cout, Person &p);public: Person(int a, int b) { m_A = a;原创 2021-08-29 12:33:44 · 135 阅读 · 0 评论 -
加号运算符重载
概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。加号运算符重载作用:实现两个自定义数据类型相加的运算对于内置数据类型,编译器知道如何进行运算代码示例:#include <iostream>using namespace std;//加号运算符重载class Person{public: //1.成员函数重载+号 //Person operator+(Person &p) //{原创 2021-08-28 10:59:53 · 199 阅读 · 0 评论 -
成员函数做友元
成员函数做友元代码示例:#include <iostream>using namespace std;#include <string>class Building;class GoodGay{public: GoodGay(); void visit(); //让visit函数可以访问Building中私有成员 void visit2(); //让visit2函数不可以访问Buildin原创 2021-08-28 10:56:04 · 143 阅读 · 0 评论 -
C++类做友元
类做友元代码示例:#include <iostream>#include <string>using namespace std;//类做友元class Building;class GoodGay{public: GoodGay(); void visit(); //参观函数 访问Building中的属性 Building *building;};class Building{ //Goody类是本类原创 2021-08-28 10:53:18 · 136 阅读 · 0 评论 -
const修饰成员函数
const修饰成员函数成员函数后加const后我们称这个函数为常函数常函数:常函数内不可以修改成员属性成员属性声明时加关键字mutable后,在常函数中依然可以修改常对象:声明对象前加const称该对象为常对象常对象只能调用常函数代码示例:#include <iostream>using namespace std;//常函数class Person{public: //thisz指针的本质 是指针常量 指针的指向是不可以修改的原创 2021-08-28 10:51:21 · 170 阅读 · 0 评论 -
空指针访问成员函数
空指针访问成员函数C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针如果用到this指针,需要加以判断保证代码的健壮性代码示例:#include <iostream>using namespace std;class Person{public: void showClassName() { cout << "this is Person class" << endl;原创 2021-08-28 10:47:20 · 94 阅读 · 0 评论 -
this指针概念
this指针概念上一篇我们知道在C++中成员变量和成员函数是分开储存的每一个非静态成员函数只会诞生一份函数示例,也就是说多个同类型的对象会共用一块代码那么问题是:这一块代码是如何区分那个对象调用自己的呢?C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象this指针是隐含每一个非静态成员函数的一种指针this指针不需要定义,直接使用即可this指针的用途:当形参和成员变量同名时,可用this指针来区分在类的非静态成员函数中返回对象本原创 2021-08-28 10:42:35 · 106 阅读 · 0 评论 -
成员变量和函数分开存储
C++对象模型和this指针成员变量和函数分开存储在C++中,类内的成员变量和函数分开存储只有非静态成员变量才属于类的对象上代码示例:#include <iostream>using namespace std;//成员变量和成员函数分开存储class Person{ int m_A; //非静态成员变量 属于类的对象上 static int m_B; //静态成员变量 void func() {}原创 2021-08-28 10:36:44 · 96 阅读 · 0 评论 -
C++静态成员
静态成员静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员静态成员分为:静态成员变量所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化静态成员函数所有对象共享同一个函数静态成员函数只能访问静态成员变量代码示例:#include <iostream>using namespace std;//静态成员函数//////* 所有对象共享同一个函数//*//静态成员函数只能访问静态成员变量class Person{publ原创 2021-08-28 10:34:52 · 83 阅读 · 0 评论 -
类对象作为类成员
类对象作为类成员C++类中的成员可以是另一个类的对象,我们称该成员为对象成员例如B类中有对象A作为成员,A为对象成员那么当创建B对象时,A与B的构造和析构的顺序是谁先后?示例代码:#include <iostream>#include <string>using namespace std;//类对象作为类成员//手机类class Phone{public: Phone(string pName) {原创 2021-08-28 10:30:50 · 143 阅读 · 0 评论 -
C++初始化列表
初始化列表作用:C++提供了初始化列表语法,用来初始化属性语法:构造函数():属性1(值1),属性2(值2)…{}代码示例:#include <iostream>using namespace std;//初始化列表class Person{public: //传统初始化操作 //Person(int a, int b, int c) //{ // m_A = a; // m_B = b原创 2021-08-28 10:26:14 · 122 阅读 · 0 评论 -
深拷贝与浅拷贝
深拷贝与浅拷贝深浅拷贝是面试经典问题,也是常见的一个坑浅拷贝:简单的赋值拷贝操作深拷贝:在堆区重新申请空间,进行拷贝操作代码示例:#include <iostream>using namespace std;//深拷贝与浅拷贝class Person{public: Person() { cout << "Person的默认构造函数调用" << endl; }原创 2021-08-27 10:57:23 · 99 阅读 · 0 评论 -
构造函数调用
构造函数调用默认情况下,C++编译器至少给一个类添加3个函数1.默认构造函数(无参,函数体为空)2.默认析构函数(无参,函数体为空)3.默认拷贝构造函数,对属性进行值拷贝。构造函数调用规则如下:如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造如果用户定义拷贝构造函数,C++不会提供其他构造函数代码示例:#include <iostream>using namespace std;//构造函数的调用规则//1.创建一个类,C++编译器会原创 2021-08-26 10:57:53 · 1368 阅读 · 0 评论 -
拷贝构造函数调用实际
拷贝构造函数调用实际C++中拷贝构造函数调用时机通常有三种情况使用一个已经创建完毕的对象来初始化一个新对象值传递的方式给函数参数传值以值的方式返回局部对象代码示例:#include <iostream>using namespace std;////C++中拷贝构造函数调用时机通常有三种情况//*//使用一个已经创建完毕的对象来初始化一个新对象//*//值传递的方式给函数参数传值//*//以值的方式返回局部对象class Person{public:原创 2021-08-25 10:29:52 · 135 阅读 · 0 评论 -
构造函数的分类及调用
构造函数的分类及调用两种分类方式:按参数分为:有参构造和无参构造按类型分为:普通构造和拷贝构造三种调用方式: 括号法 显示法 隐式转换发代码示例:#include <iostream>using namespace std;//1.构造函数的分类及调用//分类//按照参数分类 无参构造 (默认构造)和有参构造//按照类型分类 普通构造 拷贝构造class Person{public: //构造函数原创 2021-08-24 09:59:51 · 235 阅读 · 0 评论 -
成员属性设置为私有
成员属性设置为私有优点1:将所有成员属性设置为私有,可以自己控制读写权限优点2:对于写权限,我可以检测数据的有效性。代码示例:#include <iostream>#include <string>using namespace std;//成员属性设置为私有//将所有成员属性设置为私有,可以自己控制读写权限//对于写权限,我可以检测数据的有效性。//设计人类class Person{public: //设置姓名 void s原创 2021-08-22 14:47:54 · 395 阅读 · 0 评论 -
struct和class区别
struct和class区别在C++中struct和class唯一的区别就在于默认访问的权限不同区别:struct默认权限为公共class默认权限为私有代码示例:#include <iostream>using namespace std;class C1{ int m_A; //默认权限 是私有};struct C2{ int m_A; //默认权限 是公共};int原创 2021-08-20 10:49:01 · 178 阅读 · 0 评论 -
函数重载注意事项
函数重载注意事项引用作为重载条件函数重载碰到函数默认参数代码示例:#include <iostream>using namespace std;//函数重载注意事项//*//引用作为重载条件void func(int &a)//int &a=10;不合法{ cout << "func(int &a)调用" << endl;}void func(const int &a) //const int原创 2021-08-19 10:53:28 · 106 阅读 · 0 评论 -
C++函数重载
函数重载函数重载概述作用:函数名可以相同,提高复用性函数重载条件:同一个作用域下函数名称相同函数参数类型不同或者个数不同或者顺序不同注意:函数的返回值不可以作为函数重载的条件代码示例:#include <iostream>using namespace std;//函数重载//可以让函数名相同,提高复用性//函数重载条件://*//同一个作用域下//*//函数名称相同//*//函数参数类型不同或者个数不同或者顺序不同//void func(){原创 2021-08-18 11:22:50 · 71 阅读 · 0 评论 -
C++函数展位参数
函数展位参数C++中函数的形参列表里可以有占位,调用函数时必须填补该位置语法:返回值类型 函数名 (数据类型){}在现阶段函数函数的占位参数存在意义不大,但是后面的课程会用到该技术。代码示例:#include <iostream>using namespace std;//占位参数//返回值类型 函数名(数据类型){}//目前阶段的占位参数 我们还用不到,后面课程会用到//占位参数还可以有默认参数void func(int a, int =10){ co原创 2021-08-17 09:58:21 · 89 阅读 · 0 评论 -
C++系列函数提高
函数提高函数默认参数在C++中,函数的形参列表中的形参是可以有默认值的。语法:返回值类型 函数名 (参数=默认值){}代码示例:#include <iostream>using namespace std;//函数默认参数//如果我们自己传入数据,就用自己的数据,如果没有,那么用默认值//语法:返回值类型 函数名(形参=默认值)int func(int a, int b=20, int c=30){ return a + b + c;}//注意事项/原创 2021-08-16 09:29:10 · 92 阅读 · 0 评论 -
C++常量引用
常量引用作用:常量引用主要来修饰形参,防止误操作。在函数形成参列表中,可以加const修饰形参,防止形参改变实参。代码示例:#include<iostream>usingnamespacestd;//打印数据函数voidshowValue(int&val){//val = 1000;cout<<"val="<<val<<endl;}intmain()...原创 2021-08-11 09:41:18 · 106 阅读 · 0 评论 -
引用的本质
引用的本质本质:引用的本质在C++内部是显示一个指针常量代码示例:总结:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了。更多文章:...原创 2021-08-09 10:02:34 · 90 阅读 · 0 评论 -
C++引用做函数的返回值
引用做函数的返回值作用:引用是可以作为函数的返回值存在的。注意:不要返回局部变量引用。用法:函数调用作为左值。代码示例:#include <iostream>using namespace std;//引用函数的返回值//1.不要返回局部变量的引用int& test01(){int a = 10;//局部变量存放在四区中的栈区return a;}//2.函数的调用可以作为左值int& tes...原创 2021-08-08 10:05:15 · 270 阅读 · 0 评论 -
引用做函数参数
引用做函数参数作用:函数传参时,可以利用引用的技术让形参修饰实参。优点:可以简化指针修饰实参。代码示例:#include <iostream>using namespace std;//交换函数//1.值传递void mySwap01(int a, int b){int temp = a;a = b;b = temp;cout << "swap01 a=" << ...原创 2021-08-07 10:11:47 · 530 阅读 · 0 评论 -
C++引用注意事项
2.2引用注意事项 引用必须初始化 引用在初始化后,不可以改变 代码示例:#include <iostream>using namespace std;int main(){int a = 10;//1.引用必须初始化//int &b ;//错误,必须初始化int &b = a;//2.引用在初始化后,不可以改变int...原创 2021-08-06 16:12:24 · 210 阅读 · 0 评论 -
引用的基本用法
2.1引用的基本使用作用:给变量起别名。语法:数据类型 &别名=原名代码示例:#include <iostream>using namespace std;int main(){ //引用基本语法 //数据类型 &别名=原名 int a = 10; //创建引用 int &b = a; cout << "a="<<a << endl;原创 2021-08-04 20:42:47 · 192 阅读 · 0 评论 -
new操作符
new操作符C++中利用new操作符在堆区开辟数据堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete语法:new 数据类型利用new创建的数据,会返回该数据对应的类型的指针代码示例:#include <iostream>using namespace std;//1.new的基本语法int *func(){ //在堆区创建整形数据 //new返回是该数据类型的指针 int *p = new int(10);原创 2021-08-03 20:47:12 · 104 阅读 · 0 评论 -
使用new在堆区开辟数据
堆区: 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收 在C++中主要利用new在堆区开辟内存。代码示例:#include <iostream>using namespace std;int *func(){ //利用new关键字 可以将数据开辟到堆区 int *p = new int(10); return p;}int main(){ //在堆区开辟数据 int *p = fun原创 2021-08-02 19:45:55 · 388 阅读 · 0 评论 -
栈区的程序运行后
**1.2程序运行后**栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放代码示例: #include <iostream>using namespace std;int *func(int b)//形参数据也会放在栈区{ int a = 10; //局部变量 存放在栈区的数据在函数执行后自动释放 return &a; //返回局变量的地原创 2021-08-01 20:47:31 · 124 阅读 · 0 评论 -
C++内存四区
**1.内存分区模型:**C++程序在执行时,将内存大方向划分为4个区域:代码区:存放函数体的二进制代码,由操作系进行管理的全局区:存放全局变量和静态变量以及常量 *栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收内存四区意义:不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。1.1程序运行前在程序编译后,生成exe可执行程序,未执行该程序前分为两个区域代码区:存放CPU执行的机器原创 2021-07-31 20:23:56 · 121 阅读 · 0 评论