スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C++の知らなかったこと。

C++の知らなかった機能(規格)をひたすら列挙していきます。



char* str =
"line1"
"line2"
"line3";

これで"line1line2line3"という文字列になる。
もちろんstd::stringでもできます。
const char* STR = "line2";
char* str =
"line1"
STR
"line3";

これは不可、定数であれリテラル以外が絡むとだめらしい。

 恥ずかしいことに今までこうしてました(笑)。
const std::string STR = std::string() +
"line1" +
"line2" +
"line3";

(某中3女子さんありがとうございます!)

こういうのもできるみたい。
std::string str =
"line1\
line2\
line3";

=> "line1line2line3"

なお、これにインデント入れたりすると
std::string str =
"line1\
line2\
line3";

=> "line1 line2 line3"
こうなります…。


ところで、streamのoperator<<もしくはoperator>>以外の関数を呼び出すと、
バッファがおかしくなりません?
std::cout << "please input char: ";
char c = std::cin.get();
std::string str;
std::cout << "please input str: ";
std::cin >> str;
std::cout << "output: " << std::endl
<< c << std::endl
<< str << std::endl;

please input char: aaa
please input str: // スルーされる。
output:
a
aa

っていう。


------------------------------

C++で配列オブジェクト


Cのベターな配列受け渡し方法…こうですね。
void func(int* a, const int len){
int i;
for(i=0; i<len; i++)
a[i] = i;
}
int main(){
const int LEN = 5;
int a[5];
func(a, LEN);
}

こわい。
なにこれ怖いです。
C++11でこんなことをするわけにはいかないのです!!
ってことで…std::vector使っちゃう?
まって!! それ可変長だよ!!

ってことで…ちゃんとC++11なら固定長な配列オブジェクトが用意されていたんですね…。
<tr1/array>ヘッダstd::tr1::array<T,size>です!!
先ほどの例にならって書いてみましょう。
#include <tr1/array>
template <typename T, int size>
void func(std::tr1::array<T,size> a){
for(T i=0; i<size; i++)
a[i] = i;
}
auto main() -> int {
constexpr int LEN = 5;
std::tr1::array<int,LEN> a;
func<int,LEN>(a);
}

C++11きたこれっ!!
------------------------------
スポンサーサイト

コメント

非公開コメント
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。