LoginSignup
0

More than 3 years have passed since last update.

はじめてのC++ 【31日目】

Posted at

はじめに

機能のスマートポインタについて、さらに良い機能がありました。
std::make_shared という機能です。
この機能を使うと newdelete も使う必要がなくなります。

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_ptrstd::shared_ptrstd::make_shared_ptr

メモリの話

一日では理解できそうになかったので明日もやる。

ロベールのC++

stringクラス

・Stringクラスを使うと文字列を便利に使うことができる。
c_str 関数を使うとconst char配列のアドレスがえられる。

とりあえずコードを書いてみる。

String.cpp
#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;
}

スクリーンショット 2019-04-01 2.32.13.png

文字を足し算のように足すことができるとは、stringクラス はかなり使えそうだと感じる。演算子オーバーロードを使っていると書いている。
もし、文字列の長さを伸ばしていって、メモリが足りなくなると自動的に広いメモリを確保してくれる。std::vector みたいだなぁ。
あと、 for文 の第一引数?みたいなところで、宣言を2つできるとは知らなかった。3つも試してみたが、コンパイル通ったのでいくつでもできるみたい。

stringクラス は便利だが、const char* を引数にとる文字列動作関数があったとしても使えない。そこで、 c_str というメンバ関数が用意されている。この関数を呼ぶと文字列のアドレスを返してくれる。

こんぱいるエラー.cpp
void Foo(const char* str);

string str = "hoge";
Foo(str); //こんパイルエラー
これでOK.cpp
void Foo(const char* str);

string str = "hoge";
Foo(str.c_str());

終わりに

メモリの記事を呼んでみたがいまいち理解できない。いろいろな記事を読み漁ってみようと思う。
おやすみなさい。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0