
Thinking in C++
文章平均质量分 65
43118
JonyChan技术学习过程中的总结
展开
-
Sulution for Thinking in C++
2 Chapter 22-3#include <iostream>#include <fstream>#include <string>using namespace std;int main(int argc, char const *argv[]){ ifstream in("03.txt"); ifstream in2("03.txt"); ifstream in3("03.txt"); ofstream out("03_write.txt原创 2021-04-06 09:10:40 · 115 阅读 · 0 评论 -
Think in in C++[vol2]【10】设计模式
1.简化习俗1.1 信使信使(messenger)将消息封装到一个对象中到处传递,而不是将消息的所有片段分开进行传递。没有信使,下例的translate()的代码读起来非常缺乏条理。#include <iostream>#include <string>using namespace std;class Point{public: int x, y, z; Point(int xi, int yi, int zi) : x(xi), y(yi),原创 2021-03-08 14:40:25 · 189 阅读 · 0 评论 -
Think in in C++[vol2]【9】多重继承
1.接口继承与模板继承接口继承:class Printable{public: Printable(){} virtual void print(ostream&) const = 0;};class Intable{public: virtual ~Intable() {} virtual int toInt() const = 0;};class Stringable{public: Stringable(){} virtual ~Stringable(原创 2021-03-04 15:11:16 · 158 阅读 · 0 评论 -
Think in in C++[vol2]【7】通用容器
1.容器及其分类总结分类容器序列容器vector、list、deque容器适配器queue、stack、priority_queue关联式容器set、map、multiset、multimap原创 2021-02-24 10:48:43 · 111 阅读 · 0 评论 -
Think in in C++[vol2]【6】通用算法
标准模板库(STL)是标准C++库的子集。copy(a, a + SIZE, b ):前两个参数表示输入序列的范围。第1指针指向该序列的第1个元素的起始位置,第2 个指针指向数组的超越末尾的位置,第3个指针指向输出序列的位置。template<typename T> void copy(T* begin, T*end, T* dest) { while (begin != end) *begin++ = *dest**;}迭代器Iterator本质上与指针相同,所以可以在.原创 2021-02-14 22:27:30 · 125 阅读 · 0 评论 -
Think in in C++[vol2]【5】深入理解模板
1.无类型模板参数由于N的值在编译时时已知的,内含的data数组可以被置于运行时堆栈,而不是动态存储空间。任意一个N的取值都会产生一个惟一的类类型。template<class T, size_t N> class Stack { T data[N]; size_t count; public: void push(const T&t); // Etc};2.默认模板参数可以为模板的所有参数提供默认值,但当声明一个实例时必须使用一对空的尖括号,这样编译器原创 2021-02-10 16:53:32 · 145 阅读 · 0 评论 -
Think in in C++[vol2]【4】输入输出流
1.fputs()与f.gets()fputs(): C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。int fputs(const char *str, FILE *stream)#include <stdio.h>int main (){ FILE *fp; fp = fopen("file.txt", "w+"); fputs("这是 C 语言。"原创 2021-02-09 21:29:04 · 130 阅读 · 0 评论 -
Think in in C++[vol2]【3】深入理解字符串
1.字符串的内部是什么字符串存储单元分配规则明确规定:允许但不要求引用计数实现,但无论其实现是否引用计数,其语义都必须一致。2.创建并初始化字符串imBlank对象被初始化包含“没有字符”string imBlank;string a = “dfdf” "fdsfd"可以直接将字符串拼接数据成员npos是string类的一个静态常量成员,表示一个不存在的字符位置。3.替换字符串中的字符replace常用的重载形式:string.replace(int startPos, i原创 2021-02-09 12:19:01 · 111 阅读 · 0 评论 -
Think in in C++[vol2]【1】异常处理
1.几种与指针相关的constconst char* ptr = data:指针不能变换,指针的值可以变换char* const ptr = data:指针可以变换,指针的值不可以变换const char* const ptr = data:指针不能变换,指针的值也不能变换2.抛出异常throw()class MyError { const char* const message;public: MyError(const char* const m原创 2021-01-31 20:44:52 · 165 阅读 · 2 评论 -
Thinking in C++【15】模板介绍
1.模板语法template关键字告诉编译器,随后的类定义将操作一个或更多未指明的类型。当由这个模板产生实际类代码时,必须指定这些类型以使编译器能够替换它们。template class Array { T A[size]; }template<class T>class Array { enum { size = 100 }; T A[size];public: T& operator[](int index) { require原创 2021-01-22 10:43:24 · 141 阅读 · 0 评论 -
Thinking in C++【14】多态性和虚函数
1.早捆绑与晚捆绑把函数体与函数调用相联系称为捆绑。早捆绑:捆绑在程序运行之前(由编译器和连接器)完成取一个对象的地址,并将其作为基类的地址来处理,这称为向上类型转换enum note { middleC, Csharp, Eflat };class Instrument {public: void play(note) const { cout << "Instrument::play\n" << endl; }};class W原创 2021-01-21 10:12:47 · 229 阅读 · 0 评论 -
Thinking in C++【继承和组合】
1.继承语法在类的左括号的前面,加一个冒号和基类的名字,这样,将会自动地得到基类中的所用数据成员和成员函数。Y对X进行了继承,这意味着Y将包含X中的所有数据成员和成员函数。即,Y的大小是X大小的两倍。Y依然不能直接访问X的私有成员,但X的私有成员仍然占有存储空间。如果子类Y没有重写X的函数,如read(),那么调用的是父类X这个函数。class X { int i;public: X() {i = 0;} void set(int ii) { i = ii;} int read() c原创 2021-01-12 22:35:12 · 311 阅读 · 0 评论 -
Thinking in C++【9】名字控制
1.static的两种基本含义在固定的地址上(静态数据区)进行存储分配,而不是每次函数调用时正在堆栈上产生;对一个特定的编译单位来说是局部的,即static控制名字的可见性2. 函数内部的静态变量通常,在函数体内定义一个局部变量时,编译器每次调用函数时,堆栈的指针向下移动,为这些局部变量分配内存。若在函数内部定义一个static对象,这个对象将存储在程序的静态数据区中。这个对象只在函数首次调用时初始化一次,以后它将在两次函数调用之间保持它的值。char oneChar(const原创 2021-01-11 21:31:29 · 124 阅读 · 0 评论 -
Thinking in C++【8】内联函数
1.宏代码的高效性在C中,保持效率的一个方法是使用宏。宏的实现是用预处理器。预处理器直接用宏代码代替宏调用,所以就没有了参数压栈、生成汇报代码的CALL、返回参数、执行汇编语言的RETURN调用。所有工作由预处理器完成。缺点:在C/C++,宏调用隐藏了难以发现的错误;//eg1:#define F (x) (x+1) //此处F与(x)有空格,预处理器因为F = (x) (x+1),而不是F(x) = (x+1)//eg2:#define FLOOR(x, b) x>=b?0:1原创 2021-01-11 20:38:46 · 106 阅读 · 1 评论 -
Thinking in C++【7】常量Const
1.值替代预处理器的工作:预处理器只做文本替代,无类型检查概念,也无类型检查功能。预处理器在C中用值替代的典型用法是宏定义:#define BUFSIZE 100缺点:变量无类型信息,会隐藏一些很难发现的错误。编译器的工作:使用constconst int bufsize = 100;2.头文件里的const无论是使用**#define还是const**,都要把它们放在头文件里。通过包含头文件,可以把const定义单独放在一个地方并把它分配一个编译单元。const默认为内部连接,即原创 2021-01-11 10:57:56 · 140 阅读 · 0 评论 -
Thinking in C++【6】函数重载与默认参数
1.类型安全性第一个文件中,函数定义是://Function definitionvoid f(int){}第二个文件中,函数在错误的声明后调用://Function misdeclarationvoid f(int);int main(){ f(1); //Causes a linker error}在C中,第二个文件可以编译成功,连接也能成功,但在C++中却不行。因为编译器会修饰这些名字,把它变成了诸如f_int之类的名字,而使用的函数是f_char。当连接器试图找到f_ch原创 2021-01-08 10:05:02 · 132 阅读 · 0 评论 -
Thinking in C++【5】初始化与清除
1.用构造函数确保初始化构造函数由编译器调用,所以构造函数的名字要与类名字相同,这样的函数在初始化时会被自动被调用。class X { int i;public: X();}void f() { X a;}当程序执行到a的序列点执行的点时,编译器在a的定义点处插入了一个X:X() 的调用,即构造函数自动被调用,此时编译器传给构造函数的第一个参数是 this指针(调用这一对象的地址),这个指针指向一个还未初始化的内存块。构造函数的作用正是正确的初始化该内存块。构造函数与析构函数原创 2021-01-07 22:06:08 · 101 阅读 · 0 评论 -
Thinking in C++【4】隐藏实现
1.public、private、protectedpublic:private: 该类型的创建者及类内其他成员变量protected:在private基础上,增添继承的结构也可以访问2.友元friend在结构体内部声明不属于当前结构体的函数为friend(友元),则该函数可以访问当前结构中的数据。程序员可以把一个全局函数声明为friend,也可以把另一个结构中的成员函数甚至整个结构都声明为friend://Friend allows special access//注意结构体X跟Y原创 2021-01-07 11:01:51 · 188 阅读 · 4 评论 -
Thinking in C++【3】数据抽象
1.动态存储分配一旦分配了新内存块,旧内存块中的数据必须拷贝进这个新内存块,并释放旧内存块。任何由new分配的内存块必须由delete释放,否则会造成内存泄漏。2.基本对象作用域解析运算符( :: )这样命名是因为名字现在能在不同的范围内:在全局范围或在一个struct的范围内。例如Stash::initialize(int size)表示initialize()属于stashvoid*:C++允许将任何类型的指针赋给void*3.预处理器指示#define、#ifdef和#原创 2021-01-06 21:14:29 · 120 阅读 · 1 评论 -
Thinking in C++【2】C++中的C
1.创建函数在调用函数时,编译器只是检查参数的类型,使用标识符只是为了方便阅读。因此以下声明函数是可行的。//函数声明int translate(float, float, float);func()在C++中,意味着该函数有空的参数列表;在C中,意味着不确定的参数数目(这是C的漏洞,因为在这种情况下,不能进行类型检查)。2.通过库管理器创建自己的库自己创建的库头文件放置在预处理器搜索路径 中的某处,或者在当前目录中(以便能被 #include “头文件” 发现),或在包含路径中(原创 2021-01-05 22:25:14 · 171 阅读 · 0 评论 -
Thinking in C++【1】对象的创建与使用
1.早捆绑(early binding)与晚捆绑(late binding)早捆绑:编译器会对特定的函数名产生调用,而连接器将这个调用解析为要执行代码的绝对地址。在OOP中,直到程序运行时,编译器才能确定执行代码的地址。2.vitual关键字vitual关键字表明它希望某个函数有晚捆绑的灵活性(并不需要懂得virtual使用的机制,但是没有它,我们就不能用C++进行面向对象的程序设计)。默认成员函数不能动态捆绑,故需添加virtual关键字3.创建和销毁对象栈:C++把效率控制作为原创 2021-01-05 14:09:07 · 222 阅读 · 1 评论