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

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

新規登録して質問してみよう
ただいま回答率
85.46%
C++

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

Q&A

解決済

2回答

1314閲覧

クラスのメンバの初期化

kansuke_t

総合スコア36

C++

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

0グッド

0クリップ

投稿2020/11/17 09:48

発生している問題

初期化の方法が正しいのかが,わかりません。

ソースコード

c++

1class A{ 2 public: 3 int i; 4 const int j; 5 private: 6 int k; 7}; 8int main(){ 9 A a{.i=10, 10 .j=10, 11 .k=10 12 }; 13 return 0; 14}

試したこと

cpprefjpで調べました。
(もしかしたら,一様初期化と関係している?)
そして、上のソースコードのようなものをコンパイルしました。
privateだったからかkのところでエラーがでました。

教えてほしいこと

上のソースコードの,i,j,kについて,
どれがC++の文法的に,正しいのかが分かりません。
そして,正しかったとしたらstd::stringなどのオブジェクトは
初期化できるのでしょうか?
ご教授ねがいます。

補足情報(FW/ツールのバージョンなど)

windows10
g++9.2.0
コンパイルオプションg++ hoge.cpp -o hoge -Wall -Wextra -std=c++1z

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

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

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

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

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

guest

回答2

0

ベストアンサー

指示付き初期化子はc++20からの機能らしいですので、c++17では、文法的に正しいかどうかといわれると誤りです。
https://ja.cppreference.com/w/cpp/language/aggregate_initialization

指示付き初期化は、gccの拡張機能として入っているため、掲題のコードではprivate以外はエラーにならなかったのでしょう。
拡張機能をエラーにするには、-pedantic-errors オプションを付けてください。

この初期化方法では、privateの初期化はできないです。privateですので...
privateはコンストラクタ等で初期するしかないと思います(そのためのprivateですから)。
stirng等のオブジェクトも当然、初期化できます。

投稿2020/11/18 00:40

akiruno-oneone

総合スコア815

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

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

0

コンストラクタを使いましょう。

C++

1 2class A 3{ 4public: 5 A():i(10),j(10),k(10) {} 6};

投稿2020/11/17 12:01

t_obara

総合スコア5488

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問