随笔分类 - 编程语言及数据结构 / C++
摘要:函数重写回顾父类中被重写的函数依然会继承给子类子类中重写的函数将覆盖父类中的函数通过作用域分辨符(::)可以访问到父类中的函数Child c;Parent* p = &c; c.Parent::print(); //从父类中继承c.print(); //在子类中重写 p->print(); //父类
阅读全文
摘要:父子间的赋值兼容子类对象可以当作父类对象使用(兼容性)-子类对象可以直接赋值为父类对象-子类对象可以直接初始化父类对象-父类指针可以直接指向子类对象-父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时-子类对象退化为父类对象-只能访问父类中定义的成员-可以直接访问被子类覆盖的同名成员
阅读全文
摘要:父子间冲突子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么?同名成员变量 子类可以定义父类中的同名成员子类中的同名成员将隐藏父类中的同名成员父类中的同名成员依然存在于子类中通过作用域分辨符(::)访问父类中的同名成员 再论重载类中的成员函数可以进行重载1.重载函数的本质为多
阅读全文
摘要:如何初始化父类成员?父类构造函数和子类构造函数有什么关系?子类中可以定义构造函数子类构造函数-必须对继承而来的成员进行初始化 直接通过初始化列表或者赋值的方式进行初始化 调用父类构造函数进行初始化 父类构造函数在子类中的调用方式-默认调用 适用于无参构造函数和使用默认参数的构造函数-显示调用 通过初
阅读全文
摘要:被忽视的细节冒号(:)表示继承关系,Parent表示被继承的类,public的意义是什么?class Parent{ }; class Child : public Parent{ }; 有趣的问题是否可以将继承语句中的public换成protected或者private?如果可以,与public继
阅读全文
摘要:子类是否可以直接访问父类的私有成员? 编译出错,那如何访问父类中的非公有成员呢? 面向对象中的访问级别不只是public和private 可以定义protected访问级别 关键字protected的意义 修饰的成员不能被外界直接访问 修饰的成员可以被子类直接访问 定义类时,访问级别的选择 继承与组
阅读全文
摘要:类之间的组合关系 生活中的一个简单例子: 电脑是由CPU、内存、硬盘、主板等组成。电脑缺少它们其中的任一部分都无法正确运行,它们同生死。下面用程序进行描述: 组合关系的特点-将其它类的对象作为当前类的成员使用-当前类的对象与成员对象的生命周期相同-成员对象在用法上与普通对象完全一致 在实际的工程开发
阅读全文
摘要:逗号操作符逗号操作符(,)可以构成逗号表达式-逗号表达式用于将多个子表达式连接为一个表达式-逗号表达式的值为最后一个子表达式的值-逗号表达式中的前N-1个子表达式可以没有返回值-逗号表达式按照从左向右的顺序计算每个子表达式的值exp1, exp2, exp3, ... , expN 逗号表达式的实例
阅读全文
摘要:逻辑运算的原生语义-操作数只有两种值(true和false)-逻辑表达式不完全计算就能确定最终值 短路规则-最终结果只能是true或者false 首先看一个C语言的例子: 这个例子运行结果与我们分析的一致。 看下面这个例子:会颠覆你的认知。 问题的本质分析1.C++通过函数调用扩展操作符的功能2.进
阅读全文
摘要:内存泄露(臭名昭著的Bug)-动态申请堆空间,用完后不归还-C++语言中没有垃圾回收的机制(java、C#有垃圾回收机制)-指针无法控制所指堆空间的生命周期 这个程序会造成内存的泄露,你指申请了堆空间,但是没有释放。p是一个局部变量,在for循环结束之后就消失了,但是它指的堆空间并没有消失,你无法使
阅读全文
摘要:实例1: 下面的代码输出什么,为什么? 我们期望p最终为12345abcde,但是事与愿违,最终的打印结果是12345,为什么会这样呢? 当向字符串的尾部插入一个新的字符串的时候,m_cstr指针就发生了改变。它将重新申请一片堆空间,并且将原来的字符串12345和新的要被插入到尾部的字符串abced
阅读全文
摘要:什么时候需要重载赋值操作符?编译器是否提供默认的赋值操作符? 编译器为每个类默认重载了赋值操作符默认的赋值操作符仅完成浅拷贝当需要进行深度拷贝时必须重载赋值操作符赋值操作符与拷贝构造函数有相同的存在意义 编译时可以通过,运行时程序发生崩溃。 原因:t2 = t1; 程序在崩溃之前,指向了相同的堆空间
阅读全文
摘要:客户需求编写一个函数-函数可以获得斐波那契数列每项的值-每调用一次返回一个值-函数可根据需要重复使用for(int i=0; i<10; i++){ cout << fib() << endl;} 存在的问题函数一旦开始调用就无法重来函数为全局函数,是唯一的,无法多次独立使用无法指定某个具体的数列项
阅读全文
摘要:原始代码一: IntArray.h IntArray.cpp main.cpp 原生代码二:使用上篇博客中重载的数组操作符 IntArray.h IntArray.cpp main.cpp 以上就利用了我们上篇博客中介绍的重载数组类的操作符。但是在main.cpp中你会看到*a的存在。在C++中,能
阅读全文
摘要:string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗?string类最大限度的考虑了C字符串的兼容性可以按照使用C字符串的方式使用string对象 从上面的例子可以看出,string类对象是支持数组的下标访问的? 问题:难道类的对象也支持数组的下标访问? 举个简单的例子: 说明C+
阅读全文
摘要:字符串与数字转换-标准库中提供了相关的类对字符串和数字进行转换-字符串流类(sstream)用于string的转换.<sstream>-相关头文件.istringstream-字符串输入流.ostringstream-字符串输出流 使用方法-string-->数字istringstream iss(
阅读全文
摘要:历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串。C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同样支持)C语言不支持自定义类型,因此无法获得字符串类型。(C++中支持自定义类型)解决方案:从C到C
阅读全文
摘要:重载左移操作符 操作符 << 的原生意义是按位左移,例:1 << 2;其意义是将整数1按位左移2位,即:0000 0001 > 0000 0100重载左移操作符,将变量或常量左移到一个对象中。 将程序进一步优化,将设在main函数中这样写: cout << 1 << '\n',这样写编译时会出错。
阅读全文
摘要:完善的复数类复数类应该具有的操作运算:+,-,*,/比较:==,!=赋值:=求模:modulus 利用操作符重载-统一复数与实数的运算方式-统一复数与实数的比较方式 Complex operator + (const Complex& c);Complex operator - (const Com
阅读全文
摘要:下面的程序可行吗 class Complex{public: int a; int b;}; int main(){ Complex c1 = {1,2}; Complex c2 = {3,4}; Complex c3 = c1 + c2; return 0; }现在这程序肯定编译不过,因为现在的+
阅读全文