
唐佐林老师C++学习笔记
文章平均质量分 54
LangLang_2020
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++对象模型分析(上)
C++对象模型分析(上) 回归本质 class是一种特殊的struct 在内存中class依旧可以看作变量的集合 class与struct遵循相同的内存对齐规则 class中的成员函数与成员变量是分开存放的 每个对象有独立的成员变量 所有对象共享类中的成员函数 值得思考的问题 class A { int i; int j; char c; double d; } sizeof(A) = ? struct B { int i; int j原创 2022-01-12 10:30:37 · 117 阅读 · 0 评论 -
多态的概念和意义
多态的概念和意义 函数重载重写 父类中被重写的函数依然会继承给子类 子类中重写的函数将覆盖父类中的函数 通过作用域分辨符(::)可以访问到父类中的函数 Child c; Parent* p = &c; c.Parent::print(); c.print(); p->print(); 面向对象中期望的行为 根据实际的对象类型判断如何调用重写函数 父类指针(引用)指向 父类对象则调用父类中定义的函数 子类对象则调用子类中定义的重写函数 面向对象中的多态的概念 根据实际的对象原创 2022-01-10 14:10:33 · 131 阅读 · 0 评论 -
同名覆盖引发的问题
同名覆盖引发的问题 父子间的赋值兼容 子类对象可以当做父类对象使用(兼容性) 子类对象可以直接赋值给父类对象 子类对象可以直接初始化父类对象 父类指针可以直接指向子类对象 父类引用可以直接引用子类对象 //48-1.cpp #include <iostream> #include <string> using namespace std; class Parent { public: int mi; void add(int i) {原创 2022-01-08 17:50:48 · 111 阅读 · 0 评论 -
父子间的冲突
父子间的冲突 思考 子类中是否可以定义父类中的同名成员? 如果可以,如何区分?如果不可以,为什么? //47-1.cpp #include <iostream> #include <string> using namespace std; class Parent { public: int mi; }; class Child : public Parent { public: int mi; }; int main() { Child c;原创 2022-01-08 17:49:13 · 104 阅读 · 0 评论 -
继承中的构造与析构
继承中的构造与析构 思考 如何初始化父类成员? 父类构造函数和子类构造函数有什么关系? 子类对象的构造 子类中可以定义构造函数 子类构造函数 必须对继承而来的成员进行初始化 直接通过初始化列表或者赋值的方式进行初始 调用父类构造函数进行初始化 父类构造函数在子类中的调用方式 默认调用 适用于无参构造函数和使用默认参数的构造函数 显示调用 通过初始化列表进行调用 适用于所有父类构造函数 class Child : public Parent { public: Child()原创 2022-01-07 23:04:13 · 212 阅读 · 0 评论 -
不同的继承方式
不同的继承方式 1、被忽略的细节 冒号(:)表示继承关系,Parent表示被继承的类,public的意义是什么? class Parent { }; class Child : public Parent { }; 2、有趣的问题 是否可以将继承语句中的public换成proteced或private?如果可以,与``public`继承有什么区别? //45-1.cpp #include<iostream> #include<string> using na原创 2022-01-06 22:50:54 · 485 阅读 · 0 评论 -
继承中的访问级别
继承中的访问级别 1、值得思考的问题 子类是否可以直接访问父类的私有成员? 2、思考过程 //44-1.cpp #include<iostream> #include<string> using namespace std; class Parent { private: int mv; public: Parent() { mv = 100; } int value() { return mv;原创 2022-01-05 23:26:55 · 115 阅读 · 0 评论 -
继承的概念和意义
继承的概念和意义 1、思考 类之间是否存在直接的关联关系? 2、生活中的例子 2.1、组合关系:整体与部分的关系 //43-1.cpp #include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory()原创 2022-01-04 22:26:02 · 181 阅读 · 0 评论 -
智能指针分析
智能指针分析 1、永恒的话题 内存泄漏(臭名昭著的Bug) 动态申请堆空间,用完后不归还 C++语言中没有垃圾回收的机制 指针无法控制所指堆空间的生命周期 2、示例程序 #include<iostream> #include<string> using namespace std; class Test { private: int i; public: Test(int i) { this->i = i; }原创 2021-11-08 22:30:14 · 109 阅读 · 1 评论 -
经典问题解析三
经典问题解析三 1、关于赋值的疑问 什么时候需要重载赋值操作符?编 译器是否提供默认的赋值操作? 编译器为每个类默认重载了赋值操作符 默认的赋值操作符仅完成浅拷贝 当需要进行深拷贝时必须重载赋值操作符 赋值操作符与拷贝构造函数有相同的存在意义 2、代码实例 如何解决? //36-1.cpp #include<iostream> #include<string> using namespace std; class Test { int* m_pointer; p原创 2021-11-07 00:06:54 · 453 阅读 · 0 评论 -
函数对象分析
函数对象分析 1、客户需求 编写一个函数 函数可以获取斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 for(int i = 0; i < 10; i++) { cout << fib() << endl; } //35-1.cpp #include <iostream> #include <string> using namespace std; int fib() { static int a0原创 2021-11-06 22:24:23 · 105 阅读 · 0 评论 -
数组操作符的重载
数组操作符的重载 1、问题 string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗? 2、字符串类的兼容性 string类最大限度的考虑了C字符串的兼容性 可以按照使用C字符串的方式使用string对象 string s = "a1b2c3d4e"; int n = 0; for(int i = 0; i < s.length(); i++) { if( isdigit(s[i]) ) { n++; } } 3、编程实验 #include原创 2021-11-03 23:08:07 · 168 阅读 · 0 评论 -
C++中的字符串类
C++中的字符串类 一、历史遗留问题 C语言不支持真正意义上的字符串 C语言用字符数组和一维函数实现字符串操作 C语言不支持自定义类型,因此无法获得字符串类型 二、解决方案 从C到C++的进化过程引入了自定义类型 在C++中可以通过类完成字符串类型的定义 问题: C++中的原生类型系统是否包含字符串类型? 三、标准库中的字符串类 C++语言直接支持C语言的所有概念 C++语言中没有原生的字符串类型 C++标准库提供了string类型 string直接支持字符串连接 string直接支持字符串原创 2021-11-02 23:53:02 · 334 阅读 · 0 评论 -
初识C++标椎库
初识C++标椎库 1、有趣的重载 2、编程实验 //32-1.cpp #include <stdio.h> #include <string.h> const char endl = '\n'; //命令行 class Console { public: Console& operator << (int i) { printf("%d",i); return *this; } Console& operator <<原创 2021-09-30 11:34:20 · 175 阅读 · 0 评论 -
完善的复数类
完善的复数类 1、复数类应该具有的操作 运算:+,-,*,/ 比较:==,!= 赋值:= 求模:modulus 2、利用操作符重载 统一复数与实数的运算方式 统一复数与实数的比较方式 Complex operator + (const Complex& c); Complex operator - (const Complex& c); Complex operator * (const Complex& c); Complex operator / (const Compl原创 2021-09-30 09:48:03 · 96 阅读 · 0 评论 -
操作符重载的概念
操作符重载的概念 1、需要解决的问题 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I5vCdmqz-1632839392178)(https://i.loli.net/2021/09/28/Mc6ESpPqD8175HV.png)] //尝试1 //30-1.cpp #include <stdio.h> #include <string.h> class Complex { int a; int b; public: Complex(int原创 2021-09-28 22:30:26 · 167 阅读 · 0 评论 -
类中的函数重载
类中的函数重载 一、函数重载回顾 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 二、类中的重载 类中的成员函数可以进行重载 构造函数的重载 普通成员函数的重载 静态成员函数的重载 问题: 全局函数,普通成员函数以及静态成员函数之间是否可以构成重载? 三、万变不离其宗 1、重载函数的本质为多个不同的函数 2、函数名和参数列表是唯一的标识 3、函数重载必然发生在同一个作用域中 4、原创 2021-09-28 00:08:15 · 666 阅读 · 0 评论 -
二阶构造模式
一、构造函数的回顾 关于构造函数 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用 二、问题 1、如何判断构造函数的执行结果? 2、在构造函数中执行return语句会发生什么? 3、构造函数执行结束是否意味着对象构造成功? 三、编程实验 #include <stdio.h> class Test { int mi; int mj; public: Test(int i, int j) { mi = i; return;//原创 2021-09-23 23:13:14 · 190 阅读 · 0 评论 -
类的静态成员函数
类的静态成员函数 未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数据 #include <stdio.h> class Test { static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0;原创 2021-08-27 01:30:31 · 609 阅读 · 0 评论 -
类的静态成员变量
类的静态成员变量 成员变量的回顾 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 //尝试 #include <stdio.h> int gCount = 0; class Test { int mCount; public: Test():mCount(0) { gCount++; } ~Test()原创 2021-08-26 02:28:28 · 343 阅读 · 0 评论 -
经典问题解析
经典问题解析 一、关于析构的疑问 当程序中存在多个对象的时候,如何确定这些对象的析构对象? 1、单个对象创建时,构造函数的调用顺序: 1)调用父类的构造过程 2)调用成员变量的构造函数(调用顺序与声明顺序相同) 3)调用类自身的构造函数 析构函数与对应构造函数的调用顺序相反 2、多个对象析构时 ——析构顺序与构造顺序想法 #include <stdio.h> class Member { const char* ms; public: Member(const char* s)原创 2021-08-26 01:40:50 · 122 阅读 · 0 评论 -
神秘的临界对象
神秘的临界对象 有趣的问题 下面的程序输出什么?为什么? #include <stdio.h> class Test { private: int mi; public: Test(int i) { mi = i; } Test() { //等价于//Test(0); Test(0);//分析:临时对象,作用域与生命周期 } void print() { printf("mi = %d\n",mi); } }; int m原创 2021-08-25 15:07:02 · 110 阅读 · 0 评论 -
对象的销毁:析构函数
对象的销毁 0、类比生活 生活中的对象都是被初始化后才上市的 生活中的对象被销毁前会做一些清理工作 一、销毁的引入 一般而言,需要销毁的对象都应该做清理 解决方案 为每个类都提供一个public的free函数 对象不再需要时立即调用free函数进行清理 class Test { int *p; public: Test(){p = new int;} void free(){delete p;} }; 存在的问题 free只是一个普通的函数,必须显示的调用 对象销毁原创 2021-08-25 01:50:47 · 682 阅读 · 0 评论 -
对象的构造顺序
对象的构造顺序 问题引入 C++中的类可以定义多个对象,那么对象构造的顺序是怎样的? 顺序一 对于局部变量 当程序执行流到达对象定义语句时进行构造 #include <stdio.h> class Test { private: int mi; public: Test(int i) { mi = i; printf("Test(int i) = %d\n",mi); } Test(const Test& obj) { mi = obj.mi; prin原创 2021-08-25 00:39:00 · 171 阅读 · 0 评论 -
初始化列表的使用
一、问题引入 类中是否可以定义const成员? 下面的类定义是否合法? 如果合法,ci的值是什么,存储在哪里? class Test { private: const int ci; public: int getCI() { return ci; } }; 编程实验 #include <stdio.h> class Test { private: const int ci; public: Test() { ci = 10; } int getCI原创 2021-08-24 21:28:46 · 151 阅读 · 0 评论 -
C++构造函数
构造函数 一、思考 对象中成员变量的初始值是多少?——随机值?还是0? #include <stdio.h> class Test { private: int i; int j; public: int getI(){return i;} int getJ(){return j;} }; Test t; int main() { Test t1; printf("t1.i = %d,t1.j = %d\n",t1.getI(),t1.getJ());原创 2021-08-24 17:31:52 · 195 阅读 · 0 评论