自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 收藏
  • 关注

原创 7.1.4 构造函数

练习7.11头文件:#ifndef SALES_DATA_H#define SALES_DATA_H#include <string>using namespace std;struct Sales_data { Sales_data() = default; Sales_data(const string &s):bookNo(s){} Sales_data(const string &s, unsigned n, double p):bookNo(s),

2021-06-08 20:51:28 126

原创 7.1.3 定义类相关的非成员函数

练习7.6istream& read(istream& is, Sales_data& item) { double price = 0; is >> item.bookNo >> item.units_sold >> price; item.revenue = price * item.units_sold; return is;}ostream& print(ostream& os, co

2021-06-08 07:43:00 228

原创 7.1.2 定义改进的Sales_data类

练习7.2struct Sales_data { //定义isbn成员函数 std::string isbn() const { return bookNo; } //声明combine成员函数 Sales_data& combine(const Sales_data&); //声明avg_price成员函数 double avg_price() const; //其他数据成员 std::string bookNo; unsigned units_sold = 0;

2021-06-07 20:47:45 148

原创 7.1.1 设计Sales_data类

练习7.1头文件:#ifndef SALES_DATA_H#define SALES_DATA_H#include <string>struct Sales_data { std::string bookNo; unsigned units_sold = 0; double revenue = 0;};#endif源文件:#include <iostream>#include <vector>#include <string>

2021-06-03 21:26:36 125

原创 6.7 函数指针

int func(int,int);vector<decltype(func1)>(*pf)(int, int);

2021-06-01 20:58:10 59

原创 6.6.1 实参类型转换

练习6.52void manip(int,int);double dobj;(a)manip('a','z');char提升成int,属于通过整型提升实现的匹配。(b)manip(55.4,dobj);两个double类型的实参转换成(切除小数部分后)int,属于算术类型的转换。练习6.53(a)int calc(int&,int&);int calc(const int&,const int&);第二条声明加了个顶层const,从普通引用变

2021-05-31 21:13:27 155

原创 6.6 函数匹配

练习6.49候选函数:调用函数时对应的重载函数集中的函数被称之为候选函数。主要有2个特征:一是与被调用的函数同名,二是其声明在调用点可用。可行函数:从候选函数中选出来的能被这组实参调用的函数被称之为可行函数。主要有2个特征:一是其形参的数量与本次调用提供的实参数量相等。二是每个实参的类型与对应的形参的类型相同,或者能转换成形参的类型。练习6.50void f();void f(int);void f(int, int);void f(double, double = 3.14);(a)

2021-05-31 20:49:06 113

原创 6.5.2 内联函数和constexpr函数

练习6.43inline bool eq(const BigInt&,const BiGInt&){}内联函数放在头文件里面, 形参类型是const BigInt &。void putValues(int *arr, int size);声明放头文件里。练习6.44改成内联函数:inline bool isShorter(const string& s1, const string& s2) { return s1.size() < s2

2021-05-31 20:21:23 119

原创 6.5.1 默认实参

练习6.40int ff(int a, int b = 0, int c = 0);char* init(int ht = 24, int wd, char bckgrnd);第一条声明是正确的。第二条声明是错误的,因为形参ht被赋予了默认值,那么它后面的所有形参wd,bckgrnd必须要有默认值。练习6.41char* init(int ht, int wd = 80, char bckgrnd = ' ');int main() { init(); //错误:

2021-05-26 22:25:36 177

原创 6.4 重载函数

练习6.39int calc(int, int);int calc(const int, const int);第二条声明语句的形参类型有顶层const,并不影响传入函数的对象。因此第一条声明语句和第二条声明语句相同,重复声明。int get();double get();这两个函数除了返回类型外其他所有的要素都相同,这是不允许的。编译时报错:无法重载仅按返回类型区分的函数。int* reset(int*);double* reset(double*);形参类型不同,合法。...

2021-05-26 21:33:57 169

原创 6.3.3 返回数组指针

练习6.36string (&func(int i))[10];练习6.37使用类型别名:typedef string arrT[10]; //arrT是一个类型别名,它表示的类型是含有10个字符串的数组arrT& func(int i);// func返回一个含有10个字符串的数组的引用使用尾置返回类型://func接受一个int类型的实参,返回一个引用,该引用绑定含有10个字符串的数组auto func(int i)->string(&)[10];使

2021-05-26 20:14:27 87

原创 6.3.2 有返回值函数

练习6.30报错。for循环中的return语句没有返回值,编译器能检测到这个错误。函数在for循环之后没有提供return语句。编译器也许能检测到这个错误,也许不能。练习6.31返回局部对象的引用无效。当返回类似是常量引用,但是又给它赋值的时候,此时无效。练习6.32合法。int& get(int* arry, int index) { return arry[index]; //arry[index] = *(arry+i)}int main(){ //

2021-05-19 23:21:47 79

原创 6.2.6 含有可变形参的函数

练习6.27int error_msg(initializer_list<int> i1){ int r = 0; for (auto beg = i1.begin();beg != i1.end();++beg) r += *beg; return r;}//计算列表中所有元素的和int main(){ cout << error_msg({ 1,2,3,4,5 }); //15}练习6.28循环

2021-05-19 21:36:43 79

原创 6.2.5 main: 处理命令行选项

传参数给main函数:项目—>属性—>配置属性—>调试—>命令参数,在命令参数中输入,每个参数之间用空格隔开。练习6.25void main(int argc, char *argv[]){ //可选的实参用argv[1]开始 //argv[0]保存程序的名字,而非用户输入 string s1 = argv[1]; string s2 = argv[2]; cout << s1 + s2 << endl; system("pause");

2021-05-17 22:20:15 195

原创 6.2.4 数组形参

练习6.21int compare(const int i1,const int* i2) { return (i1 > *i2) ? i1 : *i2; }int main() { int a = 10; int b = 20; int* c = &b; cout << compare(a, c); //20}练习6.22void change_pointer(int *&p1,int* &p2) { auto temp = p1

2021-05-17 21:44:00 59

原创 6.2.3 const形参和实参

练习6.16当实参是一个常量字符串的时候,不能初始化一个普通的字符串形参,因此在函数的形参里面加一个顶层const,传给它常量对象或者是非常量对象都是可以的,更改后的代码如下所示:bool is_empty1(const string& s) { return s.empty();}练习6.17第一个函数的形参是const string,因此字符串的值不需要改变,仅仅是检查含有大写字母。而第二个函数是string,因为在走遍s的每一个字符的时候,引用的值需要得到改变,如果i是大写字母,

2021-05-17 20:32:05 168

原创 6.2.2 传引用函数

练习6.11void reset(int &i){ i = 99;}int main() { int j = 42; reset(j); cout << "j = " << j << endl; //j=99}练习6.12void reset(int &p, int &q){ int a = p; int b = q; p = b; q = a;}int main() { int i = 42, j =

2021-05-12 22:11:51 94

原创 6.2.1 传值参数

练习6.10void reset(int* ip, int* iq){ int a = *ip; int b = *iq; *ip = b; *iq = a;}int main() { int i = 42, j = 84; reset(&i, &j); cout << "i = " << i << endl; cout << "j = " << j << endl;}

2021-05-12 21:38:32 56

原创 6.1.3 分离式编译

练习6.9fact函数的定义位于一个名为fact.cc的文件中,它的声明位于名为Chapter6.h的头文件中。另外,我们在名为factMain.cc的文件中创建main函数,main函数将调用fact函数。要生成可执行文件,必须告诉编译器我们用到的代码在哪里。fact.cpp#include "Chapter6.h"int fact(int val){ int rec = 1; while (val > 1) { rec *= val--; } return rec;}

2021-05-12 21:28:27 139

原创 6.1.2 函数声明

练习6.8#pragma once#ifndef Chapter6#define Chapter6int fact(int val);double absolute(double val);#endif

2021-05-12 21:21:14 66

原创 6.1.1 局部对象

练习6.6对象的生命周期是程序执行过程中该对象存在的一段时间。形参和函数体内部定义的变量统称为局部变量。它们对函数而言是局部的,仅在函数的作用域内可见。在所有函数体之外定义的对象存在于程序的整个执行过程中。此类对象在程序启动时被创建,直到程序结束才会销毁。局部变量的生命周期依赖于定义的方式。自动对象:对于普通局部变量对应的对象来说,当函数的控制路径经过变量定义语句时创建该对象,当达到定义所在块末尾时销毁它。我们把只存在于执行期间的对象称之为自动对象。当块的执行结束后,块中创建的自动对象的值就变成未

2021-05-12 20:59:29 57

原创 5.6.3 标准异常

练习5.23int main() { int i1 = 0; int i2 = 0; double res = 0; while (cin >> i1 >> i2) { if (i2 != 0) { res = double(i1) / i2; cout << "The result of division is: " << res << endl; } else { cout <<

2021-05-11 21:50:30 55

原创 6.1 函数基础

练习6.1实参和形参的区别:实参是形参的初始值,实参有确定的值,而形参是一个虚拟变量。练习6.2

2021-05-10 20:11:02 166

原创 5.5.3 goto语句

不要在程序中使用goto语句,因为它使得程序即难理解又难修改。练习5.22int main() { int sz = get_size(); while (sz <= 0) { sz = get_size(); continue; }}

2021-05-10 19:46:09 67

原创 5.5.2 continue语句

练习5.21#include <iostream>using namespace std;#include <string>#include<vector>int main() { string s1; string s2; int cnt = 1; if (cin >> s1 ) { while (cin >> s2) { if (s1

2021-05-10 19:35:49 54

原创 5.5.1 break语句

练习5.20int main(){ string s1; string s2; int cnt = 1; if (cin >> s1) { while (cin >> s2) { if (s1 == s2) { cout << "重复的单词: "<< s2 << endl;

2021-05-07 21:52:03 97

原创 5.4.4 do while语句

练习5.18(a) do后面没加花括号,添加后,整个代码是为了计算2个数相加的结果。int main(){ do { int v1, v2; cout << "Please enter two numbers to sum:"; if (cin >> v1 >> v2) cout << "Sum is: " << v1 + v2 << endl

2021-05-07 21:05:20 100

原创 5.4.2 传统的for语句

练习5.15(a)for语句头中定义的ix变量只在for循环体内课件。for循环结束后ix就不可用了。可以通过将ix定义在循环外来修改代码:int main() { int ix = 0; //定义在循环外 for (/*空语句*/; ix != sz; ++ix) { /*...*/ } if (ix != sz)}(b)没有init-statement语句,即使为空,也不能省略分号。int main() { int ix; for ( ;ix != sz; ++ix) {/

2021-05-06 23:05:31 79

原创 5.4.1 while语句

练习5.14int main() { //读取若干string对象 vector<string> strVec; string str1; //输入的字符串 string maxStr; //出现最多次的字符 while (cin >> str1) strVec.push_back(str1);//查找连续出现的单词 int num = 1; //计数器次数 int maxNum = 1; //最大出现次数 auto b

2021-05-06 22:26:53 67

原创 5.3.2 switch语句

练习5.9int main() { unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0; char ch; while (cin >> ch) { if (ch == 'a') ++aCnt; if (ch == 'e') ++eCnt; if (ch == 'i') ++iCnt; if (ch == 'o') ++oCnt; if (ch == 'u') ++uCnt;

2021-05-02 10:38:51 121

原创 5.3.1 if语句

练习5.5int main() { const vector<string> scores = { "F","D","C","B","A","A++" }; string lettergrade; int grade = 0; while (cin >> grade) { if (grade < 60) lettergrade = scores[0]; else { lettergrade = scores[(grade - 50) / 10]

2021-04-29 21:28:21 63

原创 5.2 语句作用域

练习5.4string s = "flower";//条件声明比较包含初始化表达式//条件声明的结果必须可以转化为布尔值string::iterator iter;while (iter != s.end()) //如果迭代器不代表尾元素的下一元素{ ;}while (bool status = find(word) //find语句尚不熟悉{ if (!status) { ; } ;}...

2021-04-29 20:55:26 211

原创 5.1 简单语句

练习5.1空语句:; //空语句中只含有一个单独的分号如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要的时候,将会用到空语句,以下为示例://重复读入数据直至到达文件末尾或某次输入的值等于soughtwhile(cin >> s && s != sought) ;//空语句while 循环的条件部分首先从标准输入读取一个值并且隐式地检查 cin,判断读取是否成功,假定读取成功,条件的后半部分检查读进来的值是否等于 sought 的值。如果发现了想

2021-04-29 20:35:42 57

原创 4.11.1 算数转换

练习4.34if (fval) //如果fval是0,则条件为假,否则为真。//float to booldval = fval + ival;//double = float + int;//int转换为float//float转换为doubledval + ival * cval;//cval转化为int//int转化为double练习4.35cval = 'a' + 3;// ‘a'是char型的字符常量,'a'对应的数字值为97// char类型的值提升为int类型

2021-04-28 21:33:00 134

原创 4.10 逗号运算符

练习4.31在for语句中,使用前置和后置并没有什么区别,它的前置和后置不影响,因为仅仅改变ix和cnt的值。

2021-04-26 21:27:56 63

原创 4.9 sizeof运算符

练习4.28int main(){ //每一种内置类型所占空间的大小 cout << sizeof(bool) << endl; //1个字节 cout << sizeof(char) << endl; //1个字节 cout << sizeof(wchar_t) << endl; //2个字节 cout << sizeof(char16_t) << endl;

2021-04-26 21:04:55 70

原创 4.8 位运算符

练习4.25字符‘q’的二进制形式是01110001则~‘q’<<6的值是?位求反运算符优先于向左移位q提升成int类型00000000 00000000 00000000 01110001将提升后的值逐位求反11111111 11111111 11111111 10001110向左右移6位11111111 11111111 11111110 00111000练习4.26int类型只能确保占用16位,而我们至少需要27位.1UL << 27; 错误(此处不是

2021-04-26 20:26:40 68

原创 4.7 条件运算符

练习4.21 int main() { vector<int> a = { 0,1,2,3,4,5,6,7,8,9 }; for (auto i : a) { cout << (i % 2 == 0 ? i : 2 * i) << " "; } }练习4.22int main() { int grade = 0; cin >> grade; string fg; fg = (grade &g

2021-04-25 21:33:06 125

原创 4.6 成员访问运算符

解引用运算符的优先级低于点运算符。练习4.20#include <iostream>using namespace std;#include <string>#include<vector> int main() { vector <int> v = { 1,5,10}; auto iter = v.begin(); //iter的类型是vector<int>::iterator *iter++; //等价于*(ite

2021-04-25 20:15:15 116

原创 4.5 递增和递减运算符

练习4.17前置递增运算符和后置递增运算符的区别:前置递增运算符,先将运算对象加1,然后将改变的对象作为求值结果。后置递增运算符,也会将运算对象加1,但是求值结果是运算对象改变之前的那个值的副本。练习4.18int main() { string s = "some thing"; auto beg = s.begin(); while (beg != s.end() && !isspace(*beg)) { *beg = toupper(*++beg

2021-04-25 19:42:18 98

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除