11 2019 档案

摘要:父子间的赋值兼容子类对象可以当作父类对象使用(兼容性)-子类对象可以直接赋值为父类对象-子类对象可以直接初始化父类对象-父类指针可以直接指向子类对象-父类引用可以直接引用子类对象 当使用父类指针(引用)指向子类对象时-子类对象退化为父类对象-只能访问父类中定义的成员-可以直接访问被子类覆盖的同名成员 阅读全文
posted @ 2019-11-30 00:18 一代枭雄 阅读(204) 评论(0) 推荐(0)
摘要:父子间冲突子类中是否可以定义父类中的同名成员?如果可以,如何区分?如果不可以,为什么?同名成员变量 子类可以定义父类中的同名成员子类中的同名成员将隐藏父类中的同名成员父类中的同名成员依然存在于子类中通过作用域分辨符(::)访问父类中的同名成员 再论重载类中的成员函数可以进行重载1.重载函数的本质为多 阅读全文
posted @ 2019-11-28 22:34 一代枭雄 阅读(230) 评论(0) 推荐(0)
摘要:如何初始化父类成员?父类构造函数和子类构造函数有什么关系?子类中可以定义构造函数子类构造函数-必须对继承而来的成员进行初始化 直接通过初始化列表或者赋值的方式进行初始化 调用父类构造函数进行初始化 父类构造函数在子类中的调用方式-默认调用 适用于无参构造函数和使用默认参数的构造函数-显示调用 通过初 阅读全文
posted @ 2019-11-28 21:52 一代枭雄 阅读(208) 评论(0) 推荐(0)
摘要:被忽视的细节冒号(:)表示继承关系,Parent表示被继承的类,public的意义是什么?class Parent{ }; class Child : public Parent{ }; 有趣的问题是否可以将继承语句中的public换成protected或者private?如果可以,与public继 阅读全文
posted @ 2019-11-27 22:53 一代枭雄 阅读(243) 评论(0) 推荐(0)
摘要:子类是否可以直接访问父类的私有成员? 编译出错,那如何访问父类中的非公有成员呢? 面向对象中的访问级别不只是public和private 可以定义protected访问级别 关键字protected的意义 修饰的成员不能被外界直接访问 修饰的成员可以被子类直接访问 定义类时,访问级别的选择 继承与组 阅读全文
posted @ 2019-11-27 22:13 一代枭雄 阅读(178) 评论(0) 推荐(0)
摘要:类之间的组合关系 生活中的一个简单例子: 电脑是由CPU、内存、硬盘、主板等组成。电脑缺少它们其中的任一部分都无法正确运行,它们同生死。下面用程序进行描述: 组合关系的特点-将其它类的对象作为当前类的成员使用-当前类的对象与成员对象的生命周期相同-成员对象在用法上与普通对象完全一致 在实际的工程开发 阅读全文
posted @ 2019-11-27 20:45 一代枭雄 阅读(320) 评论(0) 推荐(0)
摘要:逗号操作符逗号操作符(,)可以构成逗号表达式-逗号表达式用于将多个子表达式连接为一个表达式-逗号表达式的值为最后一个子表达式的值-逗号表达式中的前N-1个子表达式可以没有返回值-逗号表达式按照从左向右的顺序计算每个子表达式的值exp1, exp2, exp3, ... , expN 逗号表达式的实例 阅读全文
posted @ 2019-11-26 22:59 一代枭雄 阅读(250) 评论(0) 推荐(0)
摘要:逻辑运算的原生语义-操作数只有两种值(true和false)-逻辑表达式不完全计算就能确定最终值 短路规则-最终结果只能是true或者false 首先看一个C语言的例子: 这个例子运行结果与我们分析的一致。 看下面这个例子:会颠覆你的认知。 问题的本质分析1.C++通过函数调用扩展操作符的功能2.进 阅读全文
posted @ 2019-11-26 21:22 一代枭雄 阅读(189) 评论(0) 推荐(0)
摘要:内存泄露(臭名昭著的Bug)-动态申请堆空间,用完后不归还-C++语言中没有垃圾回收的机制(java、C#有垃圾回收机制)-指针无法控制所指堆空间的生命周期 这个程序会造成内存的泄露,你指申请了堆空间,但是没有释放。p是一个局部变量,在for循环结束之后就消失了,但是它指的堆空间并没有消失,你无法使 阅读全文
posted @ 2019-11-26 20:44 一代枭雄 阅读(225) 评论(0) 推荐(0)
摘要:实例1: 下面的代码输出什么,为什么? 我们期望p最终为12345abcde,但是事与愿违,最终的打印结果是12345,为什么会这样呢? 当向字符串的尾部插入一个新的字符串的时候,m_cstr指针就发生了改变。它将重新申请一片堆空间,并且将原来的字符串12345和新的要被插入到尾部的字符串abced 阅读全文
posted @ 2019-11-25 23:05 一代枭雄 阅读(208) 评论(0) 推荐(0)
摘要:什么时候需要重载赋值操作符?编译器是否提供默认的赋值操作符? 编译器为每个类默认重载了赋值操作符默认的赋值操作符仅完成浅拷贝当需要进行深度拷贝时必须重载赋值操作符赋值操作符与拷贝构造函数有相同的存在意义 编译时可以通过,运行时程序发生崩溃。 原因:t2 = t1; 程序在崩溃之前,指向了相同的堆空间 阅读全文
posted @ 2019-11-25 22:02 一代枭雄 阅读(331) 评论(0) 推荐(0)
摘要:客户需求编写一个函数-函数可以获得斐波那契数列每项的值-每调用一次返回一个值-函数可根据需要重复使用for(int i=0; i<10; i++){ cout << fib() << endl;} 存在的问题函数一旦开始调用就无法重来函数为全局函数,是唯一的,无法多次独立使用无法指定某个具体的数列项 阅读全文
posted @ 2019-11-24 22:07 一代枭雄 阅读(166) 评论(0) 推荐(0)
摘要:原始代码一: IntArray.h IntArray.cpp main.cpp 原生代码二:使用上篇博客中重载的数组操作符 IntArray.h IntArray.cpp main.cpp 以上就利用了我们上篇博客中介绍的重载数组类的操作符。但是在main.cpp中你会看到*a的存在。在C++中,能 阅读全文
posted @ 2019-11-24 20:32 一代枭雄 阅读(218) 评论(0) 推荐(0)
摘要:string类对象还具备C方式字符串的灵活性吗?还能直接访问单个字符吗?string类最大限度的考虑了C字符串的兼容性可以按照使用C字符串的方式使用string对象 从上面的例子可以看出,string类对象是支持数组的下标访问的? 问题:难道类的对象也支持数组的下标访问? 举个简单的例子: 说明C+ 阅读全文
posted @ 2019-11-24 19:34 一代枭雄 阅读(301) 评论(0) 推荐(0)
摘要:字符串与数字转换-标准库中提供了相关的类对字符串和数字进行转换-字符串流类(sstream)用于string的转换.<sstream>-相关头文件.istringstream-字符串输入流.ostringstream-字符串输出流 使用方法-string-->数字istringstream iss( 阅读全文
posted @ 2019-11-22 23:34 一代枭雄 阅读(238) 评论(0) 推荐(0)
摘要:历史的遗留问题在C语言中没有真正意义上的字符串,为了表达字符串这个概念利用字符数组来模拟字符串。C语言不支持真正意义上的字符串 (C++也不支持)C语言用字符数组和一组函数实现字符串操作 (C++中同样支持)C语言不支持自定义类型,因此无法获得字符串类型。(C++中支持自定义类型)解决方案:从C到C 阅读全文
posted @ 2019-11-22 22:13 一代枭雄 阅读(217) 评论(0) 推荐(0)
摘要:重载左移操作符 操作符 << 的原生意义是按位左移,例:1 << 2;其意义是将整数1按位左移2位,即:0000 0001 > 0000 0100重载左移操作符,将变量或常量左移到一个对象中。 将程序进一步优化,将设在main函数中这样写: cout << 1 << '\n',这样写编译时会出错。 阅读全文
posted @ 2019-11-21 22:37 一代枭雄 阅读(199) 评论(0) 推荐(0)
摘要:完善的复数类复数类应该具有的操作运算:+,-,*,/比较:==,!=赋值:=求模:modulus 利用操作符重载-统一复数与实数的运算方式-统一复数与实数的比较方式 Complex operator + (const Complex& c);Complex operator - (const Com 阅读全文
posted @ 2019-11-20 23:30 一代枭雄 阅读(222) 评论(0) 推荐(0)
摘要:下面的程序可行吗 class Complex{public: int a; int b;}; int main(){ Complex c1 = {1,2}; Complex c2 = {3,4}; Complex c3 = c1 + c2; return 0; }现在这程序肯定编译不过,因为现在的+ 阅读全文
posted @ 2019-11-19 23:37 一代枭雄 阅读(209) 评论(0) 推荐(0)
摘要:类中的函数重载 函数重载回顾函数重载的本质为相互独立的不同函数C++中通过函数名和函数参数确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中 类中的成员函数可以进行重载-构造函数的重载-普通成员函数的重载-静态函数的重载 问题:全局函数,普通成员函数以及静态成员函数 阅读全文
posted @ 2019-11-19 23:11 一代枭雄 阅读(222) 评论(0) 推荐(0)
摘要:C++和C相互调用实际工程中C++和C代码相互调用是不可避免的C++编译器能够兼容C语言的编译方式C++编译器会优先使用C++编译的方式extern关键字能强制让C++编译器进行C方式的编译 extern "C"{ // do C-style compilation here} 假设在C++中调用用 阅读全文
posted @ 2019-11-19 22:17 一代枭雄 阅读(908) 评论(0) 推荐(0)
摘要:函数重载遇上函数指针-将重载函数名赋值为函数指针时 1. 根据重载规则挑选与函数指针列表一致的候选者; 2. 严格匹配候选者的函数类型与函数指针的函数类型 看下面的代码: 打印结果c=1 做这样的修改,typedef void(*PFUNC)(int a); 编译时将出现这样的错误, 说明当函数重载 阅读全文
posted @ 2019-11-19 21:39 一代枭雄 阅读(622) 评论(0) 推荐(0)
摘要:重载(Overload)同一个标识符在不同的上下文中有不同的意义如: "洗"和不同的词搭配后有不同的含义 洗衣服,洗脸,洗脑,洗马桶 "play"和不同的单词搭配后会有不同的含义 play chess, play piano, play basketball 重载在自然语言中是随处可见的,那么程序设 阅读全文
posted @ 2019-11-18 23:48 一代枭雄 阅读(235) 评论(0) 推荐(0)
摘要:算法的最好与最坏情况意义:当算法在最坏情况下仍然能满足需求时,可以推断,算法的最好情况和平均情况都满足需求。注意:在数据结构课程中,在没有特殊说明时,所分析算法的时间复杂度都是指最坏时间复杂度。 算法的空间复杂度(Space Complexity)-定义:S(n) = S(f(n)) .n 为算法的 阅读全文
posted @ 2019-11-17 22:16 一代枭雄 阅读(251) 评论(0) 推荐(0)
摘要:判断一个算法的效率时,操作数量中的常数项和其他次要项常常可以忽略,只需要关注最高阶项就能得出结论。(这只是定性的比较)问题:如何用符号定性的判断算法的效率? 算法的复杂度-时间复杂度 算法运行后对时间需求量的定性描述-空间复杂度 算法运行后对空间需求量的定性描述 注意:数据结构课程重点关注的是算法的 阅读全文
posted @ 2019-11-17 21:04 一代枭雄 阅读(396) 评论(0) 推荐(0)
摘要:友元的概念什么是友元?友元是C++中的一种关系友元关系发生在函数与类之间或者类与类之间友员关系是单向的,不能传递 友元的用法在类中以friend关键字声明友元类中的友元可以是其它类或者具体的函数友元不是类的一部分友元不受类中访问级别的限制友元可以直接访问具体类的所有成员 在类中用friend关键字对 阅读全文
posted @ 2019-11-17 17:48 一代枭雄 阅读(173) 评论(0) 推荐(0)
摘要:二阶构造工程开发中的构造过程可分为-资源无关的初始化操作 不可能出现异常情况的操作- 需要使用系统资源的操作 可能出现异常情况,如:内存申请,访问文件 二阶构造示例一class TwoPhaseCons{private: TwoPhaseCons(){ //第一阶段构造函数,就是用C++中的构造函数 阅读全文
posted @ 2019-11-17 15:28 一代枭雄 阅读(224) 评论(0) 推荐(0)
摘要:构造函数的回顾关于构造函数——类的构造函数用于对象的初始化——构造函数与类同名并且没有返回值——构造函数在对象定义时自动被调用 问题:1. 如何判断构造函数的执行结果? 目前来说,没有办法来判断构造函数的执行结果2. 在构造函数中执行return语句会发生什么? 在构造函数中可以存在return语句 阅读全文
posted @ 2019-11-17 11:52 一代枭雄 阅读(227) 评论(0) 推荐(0)
摘要:未完成的需求统计在程序运行期间某个类的对象数目保证程序的安全性(不能使用全局变量)随时可以获取当前对象的数目(failure) 假设程序中没有Test对象,你就无法获取当前对象的数目。因为在上一个程序中是使用对象去调用成员函数的,此时如果没有对象,如何去调用呢? 解决方案1: 上述程序,虽然可以统计 阅读全文
posted @ 2019-11-16 23:21 一代枭雄 阅读(235) 评论(0) 推荐(0)
摘要:成员变量的回顾通过对象名能够访问public成员变量每个对象的成员变量都是专属的成员变量不能在对象之间共享 (成员变量一般都设置为私有的) 新的需求统计在程序运行期间某个类的对象数目保证程序的安全性(不能使用全局变量)随时可以获取当前对象的数目 解决方案的尝试 上面这种方案显然是失败的。 可以通过一 阅读全文
posted @ 2019-11-16 21:55 一代枭雄 阅读(226) 评论(0) 推荐(0)
摘要:关于类成员的疑问成员函数和成员变量都是隶属于具体对象吗?成员变量必然是隶属具体对象的,那成员函数呢?是不是每个对象都有自己的一套成员函数呢?答案否 从面向对象的角度 对象由属性(成员变量)和方法(成员函数)构成从程序运行的角度 对象是由数据和函数构成 数据可以位于栈,堆和全局数据区 函数只能位于代码 阅读全文
posted @ 2019-11-16 20:51 一代枭雄 阅读(306) 评论(0) 推荐(0)
摘要:关于const对象的疑问const关键字能否修饰类的对象?如果可以,有什么特性?const关键字能够修饰对象const修饰的对象为只读对象只读对象的成员变量不允许被改变。(对象是只读的,成员变量不允许被改变 )只读对象是编译阶段的概念,运行时无效。 C++中的const成员函数-const对象只能调 阅读全文
posted @ 2019-11-16 20:16 一代枭雄 阅读(274) 评论(0) 推荐(0)
摘要:当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 关于析构的疑问单个对象创建时构造函数的调用顺序1. 调用父类的构造过程(后续再说)2. 调用成员变量的构造函数(调用顺序与声明顺序相同) 有可能某个类,它里面的成员是其他类的对象。此时就调用成员变量的构造函数。3. 调用类自身的构造函数 析构 阅读全文
posted @ 2019-11-13 23:56 一代枭雄 阅读(324) 评论(0) 推荐(0)
摘要:神秘的临时对象(上) 有趣的问题: 下面的程序输出什么,为什么? 程序意图:在Test()中以0作为参数调用Test(int i)将成员变量mi的初始值设置为0运行结果:成员变量mi的值为随机值 运行程序后,你会发现mi的值是一个随机数,为什么会出现这种情况呢? 思考:构造函数是一个特殊的函数是否可 阅读全文
posted @ 2019-11-13 23:30 一代枭雄 阅读(199) 评论(0) 推荐(0)
摘要:对象的销毁生活中的对象都是被初始化后才上市的(从而引入了构造函数)生活中的对象被销毁前会做一些清理工作问题:C++中如何清理需要销毁的对象一般而言,需要销毁的对象都应该做清理解决方案 为每个类都提供一个public的free函数 对象不再需要时立即调用free函数进行清理class Test{ in 阅读全文
posted @ 2019-11-13 22:23 一代枭雄 阅读(216) 评论(0) 推荐(0)
摘要:对象的构造顺序一C++中的类可以定义多个对象,那么对象的构造顺序是怎样的呢?对于局部对象当程序执行流到达对象的定义语句时进行构造对象定义 >构造 对象的构造顺序二对于堆对象当程序执行流到达new语句时,创建对象使用new创建对象将自动触发构造函数的调用 对于全局对象对象的构造顺序是不确定的不同的编译 阅读全文
posted @ 2019-11-12 23:15 一代枭雄 阅读(181) 评论(0) 推荐(0)
摘要:初始化列表(上) 类中是否可以定义const成员?下面的类定义是否合法?如果合法,ci的值是什么,存储在哪里?class Test{private: const int ci;public: int getCI() { return ci; }} 编程实验:类中是否可以存在const成员? 上面的程 阅读全文
posted @ 2019-11-06 22:32 一代枭雄 阅读(579) 评论(0) 推荐(0)
摘要:1. 两个特殊的构造函数 -无参构造函数 没有参数的构造函数 解释:无参构造函数看似非常简单,但是它就特别在它是必须存在的。因为我们要使用一个类的话,就必须创建对象。创建对象必然牵涉到构造函数的调用。 注意:当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且函数体为空。一定要特别注意,当 阅读全文
posted @ 2019-11-04 22:43 一代枭雄 阅读(259) 评论(0) 推荐(0)