C++の勉強1

最近はオライリーC++実践プログラミングって本でC++を勉強中。

C++実践プログラミング

C++実践プログラミング

15章はシンプルなポインタについて。C言語と一緒かな。

ありがちなミス

設問にあったのだけど、ポインタを返す関数は注意が必要。

#include <iostream>
#include <string>


// Cの文字列を変数に代入。その変数を返す。
char *str_c(){
	char s[30] = "ABC";
	return s;
}

// C++の文字列を変数に代入。その変数を返す。
std::string str_cpp(){
	std::string s = "ABC";
	return s;
}

int main(){
	std::cout << "c: " << str_c() << '\n';
	std::cout << "c++: " << str_cpp() << '\n';

	return 0;
}

結果はこんな感じ

c: フフフフフフフフ
c++: ABC

str_cでは、一時的な変数sへのポインタを返り値としているために問題が起こっています。
宙ぶらりんのオブジェクトへのポイントしているダングリングポインタです。


一方、C++の文字列はstringクラスのインスタンスです。
返り値として呼び出し元に渡されるときは、コピーコンストラクタを使用してインスタンスのコピーが渡されるため問題にはなりません。


という理解でいいんですかねー?


じゃぁ、stringクラスのポインタを返す関数作ったらどうなるんでしょう。

#include <iostream>
#include <string>


// C++の文字列を変数に代入。その変数を返す。
std::string *str_cpp(){
	std::string line = "ABC";
	std::string *s = &line;
	return s;
}


int main(){
	std::cout << "c++: " << *str_cpp() << '\n';

	return 0;
}

これ実行したら、エラーで停止するんだけど、なんでですかね・・・?
わからず終い。

問題を解くよ

実習15-1

ポインタを使用して配列の各要素を0に設定するプログラムを作成する

#include <iostream>
#include <string>


const int ARRAY_SIZE = 10;


// 課題で示された、配列の各要素を0に設定する関数
void init_array(int *array){
	int i;
	for (i=0; i<ARRAY_SIZE; i++){
		*(array + i) = 0;
	}
}

// 配列の表示用
void print_array(int *array, std::string text){
	int i;
	std::cout << text;
	for (i=0; i<ARRAY_SIZE; i++){
		std::cout << *(array + i) << ' ';
	}
	std::cout << '\n';
}

int main(){
	int array[ARRAY_SIZE] = {0,1,2,3,4,5,6,7,8,9};
	print_array(array, "Before: ");

	init_array(array);
	print_array(array, "After: ");

	return 0;
}

結果

Before: 0 1 2 3 4 5 6 7 8 9
After: 0 0 0 0 0 0 0 0 0 0

実習15-2

引数としてC形式の文字列を1つとり、その文字列においてホワイトスペースではない最初の文字へのポインタを返す関数を作成する

#include <iostream>
#include <string>


char *strwhite(char *line){
	char *p = line;
	while (*p++ != ' '){
		if (*p == '\0'){
			return NULL;
		}
	}
	return p;
}

int main(){
	char *line = "TEST DAYO";
	std::cout << strwhite(line) << '\n';

	return 0;
}

結果

DAYO