質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

591閲覧

c++ thisポインタ、std::arrayの実装

mkn66

総合スコア41

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/02/16 06:07

C++を勉強中でstd::arrayを実装しているところです。
2つ分からない点があります。

C++

1template < typename Array > 2struct array_iterator 3{ 4 Array & a ; 5 std::size_t i; 6 array_iterator( Array & a , std::size_t i ) 7 : a( a ) ,i(i){ } 8 9 10 typename Array::reference operator *() 11 { 12 return a[i] ; 13 } 14 15 16} ; 17 18template<typename T,std::size_t N> 19struct array 20{ 21 using value_type = T; 22 using reference = T&; 23 using size_type = std::size_t; 24 using const_reference = T const &; 25 using iterator = array_iterator<array>; 26 27 value_type storage[N]; 28 29 reference operator[](std::size_t i) 30 { 31 return storage[i]; 32 } 33 34 const_reference operator[] (std::size_t i) const 35 { 36 return storage[N]; 37 } 38 size_type size() 39 { 40 return N; 41 } 42 43 reference front() 44 { 45 return storage[0] ; 46 } 47 const_reference front() const 48 { 49 return storage[0] ; 50 } 51 52 reference back() 53 { 54 return storage[N-1] ; 55 } 56 const_reference back() const 57 { 58 return storage[N-1] ; 59 } 60 61 iterator begin() 62 { 63 return iterator(*this,0); 64 } 65 66 iterator end() 67 { 68 return iterator(*this,N); 69 } 70 71 void fill(T const &u) 72 { 73 74 } 75 76};

1つ目
クラスarray_iteratorのところの Array & a; 部分についてです。
&がついているのでreferenceを宣言しているのでしょうか?
referenceは宣言時に初期化しないといけないというのは、
クラス内では無効になるのでしょうか?

2つ目
クラスarrayのbegin、back関数の戻り値iterator(*this,N)についてです。
これはクラスarray_iteratorのコンストラクタに代入した値になるのは理解しています。
しかし、*thisがaに代入されるのが違和感があります。
*thisは呼び出したクラスのオブジェクトを示すのは理解できたのですが、どのような情報を渡しているのでしょうか?
意味がわからなかったらすいません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/02/16 06:15

> std::arrayを実装している std::array相当のコンテナクラスを独自実装しようとしている、ということでしょうか。
mkn66

2022/02/16 06:41

そういうことです。 私が学んでいる教材でそのようなことをしています。
退会済みユーザー

退会済みユーザー

2022/02/16 06:52

なるほど、得るところは多いと思うので頑張ってください。
mkn66

2022/02/16 07:08

ありがとうございます!
guest

回答1

0

ベストアンサー

referenceは宣言時に初期化しないといけないというのは、クラス内では無効になるのでしょうか?

クラスメンバとして参照を実装する場合は、メンバイニシャライザによることもできます。

しかし、*thisがaに代入されるのが違和感があります。(中略)どのような情報を渡しているのでしょうか?

thisポインタを逆参照して、自分自身のオブジェクトを渡しています。

投稿2022/02/16 06:22

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkn66

2022/02/16 06:43

自分自身のオブジェクトというのはarrayクラスの関数などの内容を全部ですか?
maisumakun

2022/02/16 06:57 編集

どのあたりに疑問があるのでしょうか? (ポインタから参照に変換するためにいったんオブジェクトを介しているだけ、という状況です)
mkn66

2022/02/16 07:17 編集

理解できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問