《C++ Primer》5th 課後練習 第六章 函數 21~30

練習 6.21 編寫一個函數,令其接受兩個參數:一個是int型的數,另一個是int指針。函數比較int的值和指針所指的值,返回較大的那個。在該函數中指針的類型應該是什麼?

int maxxorp(const int x,const int *p) {
	return (x > *p) ? x : *p;
}

應該是const int *類型

練習 6.22 編寫一個函數,令其交換兩個int指針。

#include<iostream>
using namespace std;
void swapp(int *(&x), int *(&y)) {
	int *temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 10, b = 20;
	int *pa = &b, *pb = &a;
	cout << *pa  << " " << *pb << endl;
	swapp(pa, pb);
	cout << *pa << " " << *pb << endl;
	return 0;
}

練習 6.23 參考本節介紹的幾個print函數,根據理解編寫你自己的版本。依次調用每個函數使其輸入下面定義的i和j:

#include<iostream>
#include<iterator>
using namespace std;
void print(const int &x) {
	cout << x << endl;
}
void print(const int *beg, const int *end) {
	auto iter = beg;
	for (;iter < end;++iter) {
		cout << *iter << " ";
	}
	cout << endl;
}
int main()
{
	int i = 0, j[2] = { 0, 1 };
	print(i);
	print(begin(j), end(j));
	return 0;
}

練習 6.24 描述下面這個函數的行爲。如果代碼中存在問題,請指出並改正。

void print(const int ia[10])
{
	for (size_t i = 0; i != 10; ++i)
		cout << ia[i] << endl;
}

該函數等價於

void print(const int *ia)
{
	for (size_t i = 0; i != 10; ++i)
		cout << ia[i] << endl;
}

由於傳入的ia指向的空間大小不明,有可能會發生數組越界。

可以改爲

void print(const int (&ia)[10])
{
	for (size_t i = 0; i != 10; ++i)
		cout << ia[i] << endl;
}

練習 6.25 編寫一個main函數,令其接受兩個實參。把實參的內容連接成一個string對象並輸出出來。

#include<iostream>
#include<string>
using namespace std;
int main(int argc, char **argv)
{
	string s(argv[1]);
	string t(argv[2]);
	cout << s+t << endl;
	return 0;
}

練習 6.26 編寫一個程序,使其接受本節所示的選項;輸出傳遞給main函數的實參內容。

#include<iostream>
#include<string>
using namespace std;
int main(int argc, char **argv)
{
	string str;
	for (int i = 1; i != argc; ++i)
		str = str + string(argv[i]) + " ";
	cout << str << endl;
	return 0;
}

練習 6.27 編寫一個函數,它的參數是initializer_list類型的對象,函數的功能是計算列表中所有元素的和。

#include<iostream>
#include<string>
using namespace std;
int sum(initializer_list<int> lst) {
	int sm = 0;
	for (auto &x : lst)
		sm += x;
	return sm;
}
int main(int argc, char **argv)
{
	cout << sum({ 1,2,3,4,7 }) << endl;
	cout << sum({ 1,7 }) << endl;
	return 0;
}

練習 6.28 在error_msg函數的第二個版本中包含ErrCode類型的參數,其中循環內的elem是什麼類型?

elemconst string &類型的。

練習 6.29 在範圍for循環中使用initializer_list對象時,應該將循環控制變量聲明成引用類型嗎?爲什麼?

我認爲使用auto的時候應該聲明爲常量引用,因爲其值不可更改,直接使用其引用就可。

練習 6.30 編譯第200頁的str_subrange函數,看看你的編譯器是如何處理函數中的錯誤的。

錯誤信息:(VS2017)

源.cpp(10): error C2561: “str_subrange”: 函數必須返回值

發佈了290 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章