練習 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
是什麼類型?
elem
是const string &
類型的。
練習 6.29 在範圍for
循環中使用initializer_list
對象時,應該將循環控制變量聲明成引用類型嗎?爲什麼?
我認爲使用auto的時候應該聲明爲常量引用,因爲其值不可更改,直接使用其引用就可。
練習 6.30 編譯第200頁的str_subrange
函數,看看你的編譯器是如何處理函數中的錯誤的。
錯誤信息:(VS2017)
源.cpp(10): error C2561: “str_subrange”: 函數必須返回值