【c++ primer, 5e】访问控制与封装】的更多相关文章

练习 7.16 无,类的接口定义在public说明符之后,类的实现细节定义在private说明符之后. 7.17 有.类成员的默认访问权限不同.class的类成员默认为private,struct的则默认为public. 通常来说,当我们希望定义的类的所有成员是public的时候就用struct. 7.18 p242 7.19 [友元] 练习 7.20 声明的类外函数需要直接引用类内的私有成员的时候要用到友元函数. 设计原因:并非所有的.与某个类相关的函数都适合声明成那个类的成员函数,例如书上的…
p186~p188: 函数声明1.函数只能定义一次,但是可以声明多次. 2.函数的接口:返回类型 + 函数名 + 形参类型 3.为什么要在头文件中进行函数声明???在源文件中定义?暂时理解到,这么做可以增强可读性. 4.含有函数声明的头文件应该被包含到定义函数的源文件中.(例如:#include "diy.h") 分离式编译 & 6.8 & 6.9 1.分离式编译:把源文件割成好几块放在不同的文件夹下.最终要生成可执行文件,就必须告诉编译器源文件在哪里.具体操作如下:…
p182~p185: 函数1.在调用函数和执行return语句的同时,也发生了控制权的转移. 2.函数返回值不能是一个数组.(但是可以返回一个包含数组的对象,或者指向数组的指针) 3.重要概念:名字的作用域和对象的生命周期. 4.对象的生命周期分两种情况:一种是对象定义在函数体外部(包括main函数1),则对象将存在于程序的整个执行过程,第二种是对象定义在函数体内部,被称为自动变量(包括形参和普通局部变量),在块的末尾将被自动销毁. 5.局部静态对象的生命周期是程序的整个执行过程. 6.局部静态…
p172~p177:c++的try语句块和异常处理: 1.通常,与用户交互的代码和对象相加(底层的代码)是分离开的,异常由与用户交互的代码处理(底层代码抛出异常就可以了). 2.C++的runtime_error和Java的有很大的不同!!! 3.编写异常安全的代码非常困难. 4.寻找处理代码的过程与函数调用链刚好相反,首先从抛出该异常的函数开始找匹配的catch子句. 5.好好理解这句话:异常中断了程序的正常的流程. 6.仍然不是很理解异常处理机制,暂时理解到:在必须使用的时候使用(例如文件,…
[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码执行完后,才被赋予const性质. 4.如果自定义了构造器,那么默认的构造器将无效化,可以理解为自定义内容覆盖了默认的内容.—— “要么什么都不做,要么全部都交给你来做.” 5.构造函数使用类内初始值并不是一个坏选择. 6.default.(在练习中体现) 7.构造函数初始值列表.(在练习中体现)…
练习 7.6 & 7.7 #include <iostream> #include <string> using namespace std; // Sales_data.h struct Sales_data { // public部分,对象看起来是怎么样的. std::string isbn() const { return bookNo; } // inline function Sales_data& combine(const Sales_data&…
[设计Sales_data类] 1.考虑Sales_data类应该有那些接口. isbn.combine.add.read.print... 2.考虑如何使用这些接口. Sales_data total; if (read(cin, total)) { Sales_data trans; while (read(cin, trans)) { if (total.isbn() == trans.isbn()) total.combine(trans); else { print(cout, tot…
简单的示例: #include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int main() { cout << sum(, ) << endl; int (*pf)(int, int); // 未初始化 pf = sum; cout << pf(, ) << endl; /* output: 3 7 */ ; } 遇到重载的情况,编译器通过指…
练习 6.49 候选函数:与所调用的函数的名字相同的函数的集合. 可行函数:给候选函数加上参数数量.参数类型的约束所得到的函数的集合. 6.50 a 3.4可行,二义匹配 b 2.4可行,2是最佳匹配 c 3.4可行,3是最佳匹配 d 3.4可行,4是最佳匹配 6.51 测试代码: #include <iostream> using namespace std; void f() { cout << "f1" << endl; } void f(in…
[默认实参] 1.注意点:函数的默认实参可以在函数的声明中添加,但是后续声明只能添加默认参数而不能改变先前声明的默认参数.(函数的声明通常是定义在头文件上的,多次声明同一个函数是合法的) 2.默认实参必须为全局变量,但是允许在局部改变这些变量的值,如果在局部重新声明将作为默认实参的变量,将不会有任何影响. 练习6.40b 顺序错误,默认参数应该在位置参数的右边. 6.41a 非法,没有给第一个位置参数赋值.c 合法但是背离初衷,原因是'*'会作为整型数赋值给参数wd而不是参数bckgrnd. 6…