C++自学
总结B站黑马程序员C++学习笔记及经验
@WangHM
路漫漫其修远兮,吾将上下而求索!
展开
-
VS或Qt编译链接过程中出现“无法解析的外部符号”的原因:
VS或Qt编译链接过程中出现“无法解析的外部符号”的原因原创 2022-06-20 10:41:46 · 432 阅读 · 0 评论 -
全局变量一定要初始化,否则会报错(无法链接...)
全局变量的定义:C++中全局变量的定义以及使用_Brett-CSDN博客_c++ 全局变量https://blog.csdn.net/weixin_41814716/article/details/87906401?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164663620516780271952817%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522原创 2022-03-07 15:16:09 · 279 阅读 · 0 评论 -
c++由于文件读写出错,程序不报错但不往下执行原因
fstream fout("test.txt");//因改为ofstream fout("test.txt");fout << "666" << endl;原创 2022-03-07 12:21:37 · 580 阅读 · 0 评论 -
C++学习第一百零八篇
/** 类模板与友元* 学习目标:* 掌握类模板配合友元函数的类内和类外实现* 全局函数类内实现——直接在类内声明友元即可* 全局函数类外实现——需要提前让编译器知道全局函数的存在* 建议全局函数做类内实现,用法简单,而且编译器可以直接识别*/#include<iostream>#include<string>using namespace std;//全局函数配合友元 类外实现 - 先做函数模板声明,下方在做函数模板的定义,再做友元template<.原创 2021-12-13 20:06:22 · 79 阅读 · 0 评论 -
C++学习第一百零七篇
/** 类模板分文件编写* 学习目标:* 掌握类模板成员函数分文件编写产生的问题以及解决方式* 问题:* 类模板中成员函数创建时机是在调用阶段,导致份文件编写时链接不到* 解决:* 解决方式1:直接包含.cpp源文件* 解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,.hpp时约定的名称,并不是强制*/#include<iostream>#include<string>using namespace std;//#include "per.原创 2021-12-13 20:05:18 · 472 阅读 · 0 评论 -
C++学习第一百零六篇
/** 类模板成员函数类外实现* 类模板成员函数类外实现时,需要加上模板参数列表*/#include<iostream>#include<string>using namespace std;//类模板中成员函数类外实现template<class T1,class T2>class Person{public: //成员函数类内声明 Person(T1 name, T2 age); void showPerson();public: .原创 2021-12-13 19:59:23 · 742 阅读 · 0 评论 -
C++学习第一百零五篇
/** 类模板与继承* 当类模板碰到继承时,需要注意以下几点:* 1、当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型* 2、如果不指定,编译器无法给子类分配内存* 3、如果想灵活指定出父类中T的类型,子类也需变为类模板*/#include<iostream>#include<string>using namespace std;template<class T>class Base{public: T m;};.原创 2021-12-13 19:56:39 · 609 阅读 · 0 评论 -
C++学习第一百零四篇
/** 类模板对象做函数参数* 类模板实例化出的对象,向函数传参的方式:* 1、指定传入的类型——直接显示对象的数据类型(使用比较广泛)* 2、参数模板化——将对象中的参数变为模板进行传递* 3、整个类模板化——将这个对象类型模板化进行传递*/#include<iostream>#include<string>using namespace std;//类模板template<class NameType,class AgeType = int>.原创 2021-12-13 15:31:30 · 84 阅读 · 0 评论 -
C++学习第一百零三篇
/** 类模板中成员函数创建时机* 类模板中成员函数和普通类中成员函数创建时机是有区别的:* 1、普通类中的成员函数一开始就可以创建* 2、类模板中的成员函数在调用时才创建*/原创 2021-12-12 19:36:44 · 73 阅读 · 0 评论 -
C++学习第一百零二篇
/** 类模板* 类模板语法* 类模板作用:建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表* 语法:template<typename T>* template --- 声明创建模板* typename --- 表面其后面的符号是一种数据类型,可以用class代替* T --- 通用的数据类型,名称可以替换,通常为大写字母* * 类模板和函数模板的区别:* 1、类模板没有自动类型推导的使用方式,只能用显示指定类型方式* 2、类模板.原创 2021-12-12 19:35:50 · 169 阅读 · 0 评论 -
C++学习第一百零一篇
模板的局限性局限性:模板的通用性并不是万能的例如: template<class T> void func(T a,T b) { a = b; }在上述代码中提供的赋值操作,如果传入的a和b是一个数组,就无法实现了再例如: template<class T> void f(T a, T b) { if(a > b) { ... } }在上述代码中,如果T的数据类型传入的是像P原创 2021-12-10 20:15:20 · 84 阅读 · 0 评论 -
C++学习第一百篇
/** 普通函数和函数模板的区别:* 1、普通函数调用时可以发生自动类型转换(隐式类型转换)* 2、函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换(与普通函数的主要区别)* 3、如果利用显示指定类型的方式,可以发生隐式类型转换* 总结:建议使用显示指定类型的方式,调用函数模板,因为可以自己确定通用类型T*/#include<iostream>#include<string>using namespace std;//普通函数int myAdd01.原创 2021-12-10 19:54:56 · 393 阅读 · 0 评论 -
C++学习第九十九篇
C++编程提高篇泛型编程、STL技术模板模板就是建立通用的模具,大大提高复用性 特点:模板不可以直接使用,它只是一个框架 模板的通用并不是万能的原创 2021-12-10 10:58:13 · 395 阅读 · 0 评论 -
C++学习第九十七篇
/** 二进制文件* 以二进制的方式对文件进行读写操作,打开方式要指定为ios::binary* 写文件* 二进制方式写文件主要利用流对象调用成员函数write* 函数原型:ostream& write(const char * buffer,int len);* 读文件* 二进制方式读文件主要利用流对象调用成员函数read* 函数原型:istream& read(char *buffer,int len);* 参数解释:字符指针buffer指向内存中一段存储空间,len.转载 2021-12-10 09:50:29 · 114 阅读 · 0 评论 -
C++学习第九十六篇
文件操作程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放通过文件可以将数据持久化C++中对文件操作需要包含头文件<fstream>文件类型分为两种:文本文件 文件以文本的ASCII码形式存储在计算机中 二进制文件 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们操作文件的三大类:ofstream:写操作 ifstream:读操作 fstream:读写操作文件打开方式: 注释:文件打开方式可以配合使用,利用|...原创 2021-12-09 11:26:41 · 558 阅读 · 0 评论 -
C++学习第九十五篇
/** 案例描述:* 电脑主要组成部件为 CPU(用于计算),显卡(用于显示),内存条(用于存储)* 将每个零件封装出抽象基类,并且提供不同的厂商生产不同的零件,例如Intel厂商和Lenovo厂商* 创建电脑类提供让电脑工作的函数,并且调用每个零件工作的接口* 测试时组装三台不同的电脑进行工作*/#include<iostream>#include<string>using namespace std;//抽象CPU类class CPU{public.转载 2021-12-09 10:07:11 · 97 阅读 · 0 评论 -
C++学习第九十四篇
/** 虚析构和纯虚析构* 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用子类的析构代码* 解决方式:将父类中的析构函数改为虚析构或者纯虚析构* 虚析构和纯虚析构共性:* 1、可以解决父类指针释放子类对象* 2、都需要具体的函数实现* 虚析构和纯虚析构区别:* 1、如果时纯虚析构,该类属于抽象类,无法实例化对象* 虚析构语法:* virtual ~类名(){};* 类名::~类名(){};//函数具体实现* 纯虚析构语法:* virtual ~类名(){} .原创 2021-12-08 17:02:11 · 96 阅读 · 0 评论 -
C++学习第九十三篇
/** 多态案例二-制作饮品* 案例描述:* 制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料* 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*/#include<iostream>#include<string>using namespace std;//抽象制作饮品class AbstractDrinking {public: //烧水 virtual void Boil() = 0; //冲泡 virt.原创 2021-12-08 17:01:18 · 332 阅读 · 0 评论 -
C++学习第九十二篇
/** 纯虚函数和抽象类* 在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容* 因此可以将虚函数改为纯虚函数* 纯虚函数语法:virtual 返回值类型 函数名(参数列表)= 0;* 当类中有了纯虚函数,这个类也称为抽象类* 抽象类特点:* 1、无法实例化对象* 2、子类必须重写抽象类中的纯虚函数,否则该子类也属于抽象类*/#include<iostream>#include<string>using namespace std;c.原创 2021-12-08 16:57:17 · 71 阅读 · 0 评论 -
C++学习第九十一篇
/** 多态案例——计算器类* 案例描述:分别利用普通写法和多态技术,设计实现两个操作数进行运算的计算器类* 多态优点:* 1、代码组织结构清晰* 2、可读性强* 3、利于前期和后期的扩展以及维护* C++开发提倡利用多态设计程序架构,因为多态优点很多*/原创 2021-12-08 16:55:50 · 79 阅读 · 0 评论 -
C++学习第九十篇
/** 多态的基本概念* 多态是C++面向对象三大特性之一* 多态分为两类:* 1、静态多态:函数重载和运算符重载属于静态多态,复用函数名* 2、动态多态:派生类和虚函数实现运行时多态* 静态多态和动态多态的区别:* 1、静态多态的函数地址早绑定-编译阶段确定函数地址* 2、动态多态的函数地址晚绑定-运行阶段确定函数地址* 多态满足条件:* 1、有继承关系* 2、子类重写父类中的虚函数* 多态使用条件:* 父类指针或引用指向子类对象* 重写:函数返回值类型 函数名 参数列表 完.原创 2021-12-07 11:23:56 · 86 阅读 · 0 评论 -
C++学习第八十九篇
继承方式:公共继承 public(父类属性类型全部不变继承下来) 保护继承 protected(除了private属性类型,父类其他属性类型在子类中变为protected属性类型) 私有继承 private(父类中属性类型在子类中全部都变为private属性类型)注释:不管父类中是什么属性类型,子类都继承了下来;只是编译器隐藏了父类原先的私有属性,在子类中无论何种继承方式均没有权限访问父类的私有属性!继承中构造与析构顺序:父类构造->子类构造->子类析构->父类析构.原创 2021-12-07 11:22:49 · 82 阅读 · 0 评论 -
C++学习第八十八篇
/** 继承* 继承用处:减少重复代码* 语法:class A : 继承方式 B;* A称为子类又称派生类* B称为父类又称基类* 派生类中的成员,包含两大部分:* 一类是从基类继承过来的,一类是自己增加的成员* 从基类继承过来的表现其共性,而新增的成员表现其个性*///公共页面#include<iostream>#include<string>using namespace std;class BasePage{public: void head.原创 2021-12-06 19:32:01 · 285 阅读 · 0 评论 -
C++学习第八十七篇
/** 运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型* 加号运算符重载* 左移运算符重载* 递增运算符重载* 赋值运算符重载* 关系运算符重载* 函数调用运算符重载* 注意:对于内置的数据类型表达式的运算符是不可能修改的(如1+1)* 不要滥用运算符重载*/#include<iostream>#include<string>using namespace std;class Person{public:.原创 2021-12-06 12:03:31 · 104 阅读 · 0 评论 -
C++学习第八十六篇
/** 友元* 在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术* 友元的目的就是让一个函数或者类访问另一个类中私有成员* 友元关键字:friend* 友元的三种实现:* 1、全局函数做友元* 2、类做友元* 3、成员函数做友元*/#include<iostream>#include<string>using namespace std;//全局函数做友元class Building{public: Buildi.原创 2021-12-05 18:31:55 · 273 阅读 · 0 评论 -
C++学习第八十五篇
/** const修饰成员函数* 常函数:* 1、成员函数后加const后我们称之为常函数* 2、常函数内不可以修改成员属性* 3、成员属性声明时加关键字mutable后,在常函数中依然可以修改* 常对象:* 1、声明对象前加const称该对象为常对象* 2、常对象只能调用常函数*/#include<iostream>#include<string>using namespace std;//空指针访问成员函数class Person{public.原创 2021-12-05 17:40:23 · 554 阅读 · 0 评论 -
C++学习第八十四篇
/** 空指针访问成员函数* c++中空指针也是可以调用成员函数的,但是要注意有没有用到this指针* 如果用到this指针,需要加以判断保证保证代码的健壮性*/#include<iostream>#include<string>using namespace std;//空指针访问成员函数class Person{public: void ShowClassName() { cout << "我是Person类" << en.原创 2021-12-05 10:28:21 · 235 阅读 · 0 评论 -
C++学习第八十三篇
/** this指针概念* 在C++中成员变量和成员函数是分开存储的* 每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码* 那么问题是:这一块代码是如何区分哪个对象调用自己的呢?* c++通过提供特殊的对象指针,this指针,解决上述问题。* this指针指向被调用的成员函数所属的对象* this指针是隐含每一个非静态成员函数内的一种指针,不定义需要,直接使用即可* this指针的用途:* 1、当形参和成员变量同名时,可用this指针来区分* 2、在类的.原创 2021-12-04 12:00:39 · 228 阅读 · 0 评论 -
C++学习第八十二篇
/** 静态成员函数:* 所有对象共享同一个函数* 静态成员函数只能访问静态成员变量*/#include<iostream>#include<string>using namespace std; class Person{public: static void func() { cout << "func调用" << endl; m_A = 100; //m_B = 100;//错误,静态成员函数不可以非静态成员变量.原创 2021-12-04 11:09:26 · 90 阅读 · 0 评论 -
C++学习第八十一篇
/** 静态成员函数:* 所有对象共享同一个函数* 静态成员函数只能访问静态成员变量*/#include<iostream>#include<string>using namespace std;class Person{public: static void func() { cout << "func调用" << endl; m_A = 100; //m_B = 100;//错误,静态成员函数不可以非静态成员变量 .原创 2021-12-04 10:44:48 · 102 阅读 · 0 评论 -
C++学习第八十篇
/** 静态成员* 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员* 静态成员分为:* 1、静态成员变量* 所有对象共享同一份数据* 在编译阶段分配内存* 类内声明,类外初始化(必须实现)* 2、静态成员函数* 所有对象共享同一个函数* 静态成员函数只能访问静态成员变量*/#include<iostream>#include<string>using namespace std;class Person{publ.原创 2021-12-04 10:20:59 · 216 阅读 · 0 评论 -
C++学习第七十九篇
/** 类对象作为类成员* c++类中的成员可以是另一个类的对象,我们称该成员为对象成员*/#include<iostream>#include<string>using namespace std;class Phone{public: Phone(string name) { m_PhoneName = name; cout << "Phone构造函数" << endl; } ~Phone() { cout &.原创 2021-12-04 09:42:20 · 350 阅读 · 0 评论 -
C++学习第七十八篇
/** 初始化列表作用:c++提供了初始化列表语法,用来初始化属性语法:构造函数():属性1(值1),属性2(值2)...{};*/#include<iostream>#include<string>using namespace std;class Person{public: ////传统方式初始化 //Person(int a, int b, int c) //{ // m_A = a; // m_B = b; // m_C = c; //.原创 2021-12-03 20:55:41 · 90 阅读 · 0 评论 -
C++学习第七十七篇
/** 深拷贝与浅拷贝——面试经典问题,常见的坑* 浅拷贝:简单的赋值拷贝操作* 深拷贝:在堆区重新申请空间,进行拷贝操作 */#include<iostream>#include<string>using namespace std;class Person{public: //无参(默认)构造函数 Person() { cout << "无参构造函数" << endl; } //有参构造函数 Person(int a.转载 2021-12-03 20:27:42 · 233 阅读 · 0 评论 -
C++学习第七十六篇
/** 构造函数调用规则* 默认情况下,c++编译器至少给一个类添加3个函数* 1、默认构造函数(无参,函数体为空)* 2、默认析构函数(无参,函数体为空)* 3、默认拷贝构造函数,对属性进行值拷贝* 构造函数调用规则如下:* 1、如果用户定义有参构造函数,c++不再提供默认无参构造,但是会提供默认拷贝构造* 2、如果用户定义拷贝构造函数,c++不会提供其他构造函数*/#include<iostream>#include<string>using names.原创 2021-12-03 19:58:35 · 209 阅读 · 0 评论 -
C++学习第七十五篇
/** 拷贝构造函数调用时机* c++中拷贝构造函数调用时机通常有三种情况:* 1、使用一个已经创建完毕的对象来初始化一个新对象* 2、值传递的方式给函数参数传值* 3、以值方式返回局部对象*/#include<iostream>#include<string>using namespace std;class Person{public: Person() { cout << "无参构造函数" << endl; mAg.原创 2021-12-03 19:32:23 · 77 阅读 · 0 评论 -
C++学习第七十四篇
/** 构造函数的分类及调用* 两种分类:* 按参数分为:有参构造和无参构造 无参构造又称为默认构造函数* 按类型分为:普通构造和拷贝构造* 三中调用方式:* 括号法、显示法、隐式转换法*/#include<iostream>#include<string>using namespace std;//1、构造函数分类class Person{public: //无参(默认)构造函数 Person() { cout << "无参构造.原创 2021-12-03 15:44:02 · 123 阅读 · 0 评论 -
C++学习第七十三篇
/** 构造函数与析构函数*/#include<iostream>#include<string>using namespace std;//对象的初始化与清理//1、构造函数 进行初始化操作class Person{public: //1.1构造函数 //没有返回值 不用写void //函数名 与类名相同 //构造函数可以有参数 可以发生重载 //构建对象的时候,构造函数会自动调用,而且只调用一次 Person() { cout ...原创 2021-12-03 11:01:34 · 205 阅读 · 0 评论 -
C++学习第七十二篇
/** 练习案例2:点和圆的关系*/#include<iostream>#include <string>using namespace std;#include "circle.h"#include "point.h"//判断点和圆的关系void isInCircle(Circle& c, Point& p){ //计算两点之间距离的平方 int distance = (c.getCenter().getX() - p.getX()).原创 2021-12-03 10:08:48 · 109 阅读 · 0 评论 -
C++学习第七十一篇
/** 练习案例1:设计立方体类* 设计立方体类(Cube)* 求出立方体的面积和体积* 分别用全局函数和成员函数判断两个立方体是否相等*/#include<iostream>#include <string>using namespace std; //立方体类设计//1、创建立方体类//2、设计属性//3、设计行为 获取立方体面积和体积//4、分别利用全局函数和成员函数 判断两个立方体是否相等class Cube{public: //设置长.原创 2021-12-02 21:01:42 · 84 阅读 · 0 评论