新黑马 C++基础
C++11基本语法
Scarlett2025
种一棵树最好的时间是十年前,其次是现在。——非洲经济学家Dambisa Moyo《dead aid》
展开
-
虚析构和纯虚析构函数
5.1 虚析构5.1.1 virtual ~类名() {}5.1.2 解决问题: 通过父类指针指向子类对象释放时候不干净导致的问题5.2 纯虚析构函数5.2.1 写法 virtual ~类名() = 05.2.2 类内声明 类外实现5.2.3 如果出现了纯虚析构函数,这个类也算抽象类,不可以实例化对象析构函数#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using names原创 2021-10-25 11:35:12 · 876 阅读 · 0 评论 -
抽象类和纯虚函数
4.1 纯虚函数写法 virtual void func() = 0;4.2 抽象类型4.3 抽象类 不可以实例化对象4.4 如果类 继承了抽象类, 必须重写抽象类中的纯虚函数#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class AbstractDrinking {public: //纯虚函数 //如果父类中有了 纯虚函数 子类继原创 2021-10-25 10:07:13 · 128 阅读 · 0 评论 -
多态案例-计算器案例
3.1 早期方法 是不利于扩展3.2 开发有原则 开闭原则 – 对扩展开放 对修改关闭3.3 利用多态实现 – 利于后期扩展,结构性非常好,可读性高, 效率稍微低,发生多态内部结构复杂#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;//真正的开发中,有个开发原则 开闭原则// 对扩展开放 对修改关闭//利用多态实现计算器clas原创 2021-10-24 22:00:28 · 171 阅读 · 0 评论 -
静态联编和动态联编
1.1 多态分类1.1.1 静态多态 函数重载1.1.2 动态多态 虚函数 继承关系1.2 静态联编1.2.1 地址早绑定 编译阶段绑定好地址1.3 动态联编1.3.1 地址晚绑定 ,运行时候绑定好地址1.4 多态1.4.1 父类的引用或指针指向子类对象#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Animal {p原创 2021-10-24 17:23:15 · 158 阅读 · 0 评论 -
菱形继承的问题以及解决方案
12.1 解决问题利用虚基类12.2 sheepTuo内部结构12.2.1 vbptr 虚基类指针12.2.2 指向一张 虚基类表12.2.3 通过表找到偏移量12.2.4 找到共有的数据12.3 内部工作原理 (可以不掌握)#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Animal {public: int m_age原创 2021-10-24 12:39:52 · 190 阅读 · 0 评论 -
多继承的概念以及问题
11.1 class A : public B1, public B2,….11.2 引发二义性问题11.3 想解决二义性问题,就需要通过作用域来进行区分#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Base1 {public: int m_a = 10;};class Base2 {public: int m_a =原创 2021-10-24 11:47:14 · 193 阅读 · 0 评论 -
继承中的静态成员处理
10.1 类似非静态成员函数处理10.2 如果想访问父类中的成员,加作用域即可#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Base {public: static void func() { cout << "父类func()调用" << endl; } static void func(int原创 2021-10-24 11:29:55 · 156 阅读 · 0 评论 -
继承中的同名成员处理
9.1 成员属性 直接调用先调用子类,如果想调用父类 需要作用域9.2 成员函数 直接调用先调用子类,父类的所有版本都会被隐藏,除非显示用作用域运算符去调用#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Base {public: Base() { m_a = 10; } void func1() { cout &原创 2021-10-24 11:12:49 · 169 阅读 · 0 评论 -
继承中的构造和析构顺序
8.1 子类创建对象时,先调用父类的构造,然后调用自身构造8.2 析构顺序与构造顺序相反8.3 子类是不会继承父类的构造函数和析构函数8.4 补充内容,如果父类中没有合适默认构造,那么子类可以利用初始化列表的方式显示的调用父类的其他构造#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Modulator {public: Modul原创 2021-10-22 15:52:40 · 477 阅读 · 0 评论 -
继承中的对象模型
7.1 子类会继承父类中所有的内容 ,包括了 私有属性7.2 只是我们访问不到,编译器给隐藏了7.3 cl /d1 reportSingleClassLayout类名 文件名#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Modulator {public: int m_router;private: int m_modem;原创 2021-10-22 15:22:05 · 141 阅读 · 0 评论 -
继承方式
6.1 不管公有继承 保护 还是私有 基类中的私有属性 ,都不可以继承下去6.2 公有继承6.2.1 父类中的protected 在子类中是 protected6.2.2 父类中的public 在子类中是 public6.3 保护继承6.3.1 父类中的protected 在子类中是 protected6.3.2 父类中的public 在子类中是 protected6.4 私有继承6.4.1 父类中的protected 在子类中是 private6.4.2 父类中的public 在子类中是原创 2021-10-22 10:22:39 · 92 阅读 · 0 评论 -
继承的引出
5.1 网页 很多公共部分5.2 导致实现时候有很多重复的代码5.3 引出继承,基类 (父类) 公共网页5.4 具体子类 实现不同的内容5.5 语法 class 子类 :继承方式 父类#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;//继承写法//抽象一个 基类的作家 重复的代码都写到这个基类上class Writer {publ原创 2021-10-21 22:48:54 · 81 阅读 · 0 评论 -
强化训练字符串封装
4.1 cout 输入 自定义的字符串4.2 cin 让用户输入字符串内容4.3 重载 = 运算符4.4 重载 + 运算符4.5 重载 [] 运算符4.6 重载 == 运算符#include "MyString.h"#pragma once#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;class MyString { friend ostream& operator&原创 2021-10-21 13:22:12 · 119 阅读 · 0 评论 -
()函数调用运算符重载
2.1 () 仿函数 对象() 看似像函数调用2.2 MyAdd() 匿名对象#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class MyPrint {public: MyPrint(string text) { this->m_text = text; } void operator()() { cout <原创 2021-10-19 11:59:14 · 86 阅读 · 0 评论 -
== !=关系运算符重载
1.1 自定义数据类型 不会内部做 比较 == !=1.2 所以要重载 == !=#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Nick {public: Nick(string name, int id) { this->m_id = id; this->m_name = name; } bool o原创 2021-10-19 11:12:09 · 315 阅读 · 0 评论 -
[ ]运算符重载
1.1 返回数组索引的引用1.2 int & operator[](int index)1.3 return this->pAddress[index]#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;#define SIZE 10class MyArray {public: MyArray(){ for (int i =原创 2021-10-19 10:51:27 · 164 阅读 · 0 评论 -
前置++后置++递增运算符重载
12原创 2021-10-18 22:48:39 · 496 阅读 · 0 评论 -
=赋值运算符重载
5.1 系统默认给类提供 赋值运算符写法 是简单值拷贝5.2 导致如果类中有指向堆区的指针,就可能出现深浅拷贝的问题5.3 所以要重载 = 运算符5.4 如果想链式编程 return*this#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Judy1{public: Judy1(int a) :m_a(a) {}; int m原创 2021-10-18 22:28:23 · 165 阅读 · 0 评论 -
* ->指针运算符重载(智能指针)
4.1 Person类有showAge 成员函数4.2 如果new出来的Person对象,就要让程序员自觉的去释放 delete4.3 有了智能指针,让智能指针托管这个Person对象,对象的释放就不用操心了,让智能指针管理4.4 为了让智能指针想普通的Person指针一样使用 就要重载 -> 和#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std原创 2021-10-15 13:41:05 · 632 阅读 · 0 评论 -
<<左移运算符重载
2.1 不要随意乱用符号重载2.2 内置数据类型 的运算符不可以重载2.3 cout << 直接对Person自定义数据类型 进行输出2.4 写到全局函数中 ostream& operator<< ( ostream & cout, Person & p1 ) {}2.5 如果重载时候想访问 p1的私有成员,那么全局函数要做Person的友元函数#include<iostream>#include<string>usin原创 2021-10-14 17:56:37 · 169 阅读 · 0 评论 -
+加号运算符重载
1.1 如果想让自定义数据类型 进行+运算,那么就需要重载 + 运算符1.2 在成员函数 或者 全局函数里 重写一个+运算符的函数1.3 函数名 operator+ () {}1.4 运算符重载 也可以提供多个版本#include<iostream>#include<string>using namespace std;class Nick {public: Nick() {}; Nick(int a, int b):m_a(a), m_b(b) {}; /原创 2021-10-14 17:02:02 · 792 阅读 · 0 评论 -
强化训练(数组类封装)
MyArray.h#pragma once#include <iostream>using namespace std;class MyArray {public: MyArray(); MyArray(int capacity); MyArray(const MyArray& arr); ~MyArray(); int getData(int index); void setData(int index, int val); void PushBack(in原创 2021-10-14 15:49:59 · 105 阅读 · 0 评论 -
友元函数
8.1 全局函数做友元函数8.1.1 全局函数写到 类中做声明 并且最前面写关键字 friend#include<iostream>#include<string>using namespace std;class Building { friend void BosomFriend(Building *building);public: Building() { this->BedRoom = "卧室"; this->SittingRoom原创 2021-10-11 15:26:07 · 139 阅读 · 0 评论 -
常函数与常对象
7.1 常函数 void func() const {} 常函数7.2 常函数 修饰是this指针 const Type * const this7.3 常函数 不能修改this指针执行的值7.4 常对象 在对象前 加入 const修饰 const Person p17.5 常对象 不可以调用普通的成员函数7.6 常对象 可以调用常函数7.7 用mutable修饰的关键字是在常函数可以修改的#include<iostream>#include<string>us原创 2021-10-11 14:34:04 · 192 阅读 · 0 评论 -
空指针访问成员函数
6.1 如果成员函数没有用到this,那么空指针可以直接访问6.2 如果成员函数用的this指针,就要注意,可以加if判断,如果this为NULL就return#include<iostream>#include<string>using namespace std;class Nick {public: void show() { cout << "void::Nick show()" << endl; } void showAge原创 2021-10-11 14:10:08 · 252 阅读 · 0 评论 -
this指针基本使用
5.1 指针永远指向当前对象5.2 解决命名冲突5.3 *this 指向对象本体5.4 非静态的成员函数才有this指针#include<iostream>#include<string>using namespace std;class Student {public: Student(int age) { this->age = age; } //对比年龄 void compareAge(Student &st) { if (th原创 2021-10-11 13:40:30 · 146 阅读 · 0 评论 -
C++对象模型初探-成员变量和成员属性分开处理
4.1 成员变量和成员函数是分开存储的4.2 空类的大小 14.3 只有非静态成员属性才属于对象身上#include<iostream>#include<string>#pragma pack(1)using namespace std;class Person { int m_a; //非静态成员变量,属于对象身上 void func1(); //非静态成员函数 不属于对象身上 static int m_b; //静态成员变量 ,不属于对象身上 static原创 2021-10-11 13:27:16 · 158 阅读 · 0 评论 -
单例模式案例-打印机案例
3.1 类似首相案例3.2 提供打印功能3.3 提供统计打印次数功能#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;class Printer {public: static Printer* getInstance() { return printer; } void printTxt(string str) { cout原创 2021-10-10 22:27:09 · 439 阅读 · 0 评论 -
单例模式案例 – 首相
2.1 目的 为了让类中只有一个实例,实例不需要自己释放2.2 将 默认构造 和 拷贝构造 私有化2.3 内部维护一个 对象指针2.4 私有化唯一指针2.5 对外提供 getInstance方法来访问这个指针2.6 保证类中只能实例化唯一一个对象#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>using namespace std;//创建首相类//需求 单例模式 为了创建原创 2021-10-10 22:02:10 · 121 阅读 · 0 评论 -
静态成员变量和静态成员函数
1.1 静态成员变量1.1.1 编译阶段分配内存1.1.2 所有对象共享数据1.1.3 通过对象访问、通过类名访问1.1.4 有权限控制1.1.5 类内声明 类外初始化1.2 静态成员函数1.2.1 可以访问静态成员变量,不可以方法普通成员变量1.2.2 普通成员函数 都可以访问1.2.3 静态成员函数也有权限1.2.4 可以通过对象访问,也可以通过类名进行访问#define _CRT_SECURE_NO_WARNINGS#include<iostream>#inclu原创 2021-10-10 20:04:28 · 97 阅读 · 0 评论 -
new运算符使用
#include<iostream>#include<string>using namespace std;class Nick {public: Nick() { cout << "默认构造函数调用..." << endl; } Nick(int a) { cout << "默认构造函数调用..." << endl; } ~Nick() { cout << "析构函数调用..." <原创 2021-09-23 22:41:29 · 151 阅读 · 0 评论 -
explicit关键字作用
explicit关键字 防止隐式类型转换#include<iostream>using namespace std;class Judy {public: Judy(const char *name){} explicit Judy(int a){} char *name;};void test01() { Judy str1 = "土豆"; //Judy str2 = 10; //做什么用? str2字符串为“10” 字符串长度10 Judy str3(10原创 2021-06-16 13:29:56 · 240 阅读 · 0 评论 -
类对象作为类成员的案例
类对象作为类成员时候,构造顺序先将类对象一一构造,然后构造自己,析构的顺序是相反的#include <iostream>#include<string>using namespace std;class Sport{public: Sport(){ cout<<"Sport()默认构造函数调用..."<<endl; } ~Sport(){ cout<<"Sport()析构函数调用..."<<endl; }原创 2021-06-16 10:50:11 · 148 阅读 · 0 评论 -
初始化列表
利用初始化列表 初始化数据构造函数后面 + 属性(参数), 属性(参数)…#include<iostream>using namespace std;class Nick {public: Nick() :m_n1(37), m_n2(71), m_n3(13) {}; int m_n1; int m_n2; int m_n3;};void test01() { Nick nick01; cout << "nick01.m_n1=".原创 2021-06-16 07:45:59 · 136 阅读 · 0 评论 -
深拷贝与浅拷贝
浅拷贝#define _CRT_SECURE_NO_WARNINGS#include<iostream>;using namespace std;class Nick {public: //初始化属性 Nick(char *name, int id) { m_name = (char*)malloc(strlen(name) + 1); strcpy(m_name, name); m_age = id; } ~Nick() { if (m_name !=原创 2021-06-15 23:05:24 · 129 阅读 · 0 评论 -
构造函数的调用规则
系统默认给一个类提供3个函数 默认构造、拷贝构造、析构函数当我们提供了有参构造函数,那么系统就不会给我们提供默认构造函数了。#include<iostream>using namespace std;class Nick {public: Nick(double c) { cout << "Nick(double c)..." << endl; }};void test01() { Nick n;}但是系统还会提供默认拷贝构造函原创 2021-06-14 21:47:43 · 216 阅读 · 0 评论 -
拷贝构造函数调用时机
#include<iostream>using namespace std;class Nick{public: Nick() { cout << "Nick()..." << endl; } Nick(double c) { cout << "Nick(double c)..." << endl; } Nick(const Nick& nick) { m_id = nick.m_id; cout <原创 2021-06-14 21:13:25 · 99 阅读 · 0 评论 -
构造函数的分类及调用
分类按照参数进行分类原创 2021-06-14 17:34:52 · 200 阅读 · 0 评论 -
对象的初始化和清理
构造函数写法:与类名相同,没有返回值,不写void,可以发生重载(可以有参数)构造函数由编译器自动调用,而不是手动,而且只会调用一次析构函数写法:与类名相同,类名前面加一个符号“~”,也没有返回值,不写void,不可以有参数(不能发生重载)自动调用,只会调用一次#include<iostream>using namespace std;class Person {public: Person() { cout << "Person() " <<.原创 2021-06-12 19:01:58 · 146 阅读 · 0 评论 -
const使用实例
#include<iostream>using namespace std;class Nick {public: int getA() { //m_a = 63; return m_a; }private: int m_a = 37;};void func(const Nick & nick) { nick.getA(); cout << "此时不可以使用const" << endl;}void test() {原创 2021-06-12 10:02:43 · 183 阅读 · 0 评论