はじめに
機能のスマートポインタについて、さらに良い機能がありました。
std::make_shared
という機能です。
この機能を使うと new
も delete
も使う必要がなくなります。
Stock List
皆様のおかげで基本的なポインタを理解できたと思います。ありがとうございます。
今日は、スマートポインタの使い方を学ぼうとおもいます。
ロベールのC++で、クラスの動的確保の単元をやっていますが、 new
delete
が使われているので、スマートポインタを使って delete
を使わないようにしようと思います。
未解決
・メモリ メモリの話 ←今日はここやる
・静的メンバ 参照
・std::string
・i++
と++i
の違い
・nullptr
・std::vector
・std::array
・enum class
・std::quick_exit
あとで読む
・初期化子
・みえる・みえない
・this
解決
・int const * const * const ** const * p
・スマートポインタの使い方 std::unique_ptr
やstd::shared_ptr
、std::make_shared_ptr
メモリの話
一日では理解できそうになかったので明日もやる。
ロベールのC++
stringクラス
・Stringクラスを使うと文字列を便利に使うことができる。
・c_str
関数を使うとconst char
配列のアドレスがえられる。
とりあえずコードを書いてみる。
#include <iostream>
#include <string>
int main(){
std::string hello = "Hello!";
std::cout << hello << std::endl;
hello = "Hello";
hello += ", world!";
std::cout << "「" << hello << "」を文字コードに変えると" << std::endl;
for(int i = 0, size = hello.size(); i < size; ++i) {
std::cout << (int)(unsigned char)hello[i] << ", ";
}
std::cout << std::endl
<< "になります" << std::endl;
}
文字を足し算のように足すことができるとは、stringクラス
はかなり使えそうだと感じる。演算子オーバーロードを使っていると書いている。
もし、文字列の長さを伸ばしていって、メモリが足りなくなると自動的に広いメモリを確保してくれる。std::vector
みたいだなぁ。
あと、 for文
の第一引数?みたいなところで、宣言を2つできるとは知らなかった。3つも試してみたが、コンパイル通ったのでいくつでもできるみたい。
stringクラス
は便利だが、const char*
を引数にとる文字列動作関数があったとしても使えない。そこで、 c_str
というメンバ関数が用意されている。この関数を呼ぶと文字列のアドレスを返してくれる。
void Foo(const char* str);
string str = "hoge";
Foo(str); //こんパイルエラー
void Foo(const char* str);
string str = "hoge";
Foo(str.c_str());
終わりに
メモリの記事を呼んでみたがいまいち理解できない。いろいろな記事を読み漁ってみようと思う。
おやすみなさい。