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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

Q&A

解決済

2回答

4021閲覧

C++における関数宣言の省略記法を読み解けない。

Kchan_01

総合スコア110

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

1グッド

0クリップ

投稿2020/04/21 08:36

編集2020/04/21 08:38

普段はC言語を使ってアルゴリズムを勉強しているのですが、解説にCPPが多いため、CPPも勉強し始めました。
CPPの書き方で、検索してもうまく出てこない書き方があり、質問させてください。
下記の構造体内での関数の宣言方法なのですが、どういった意味なのでしょうか。

cpp

1Edge(int t, int w) : to(t), weight(w) { }

やっていることはコンストラクタを使用して、toとweightに値を導入しているだけだと思います。
下記のように書き換えられると考えて良いでしょうか。

cpp

1Edge(int t, int w){ 2 to = t; 3 weight = w; 4}

##調べた内容

変数名(値)で変数に代入できるのかと、リファレンスを見てみましたがありませんでした。

代入演算子 - cppreference.com
https://ja.cppreference.com/w/cpp/language/operator_assignment

##全コード

cpp

1#include <iostream> 2#include <vector> 3using namespace std; 4 5struct Edge { 6 int to; // 辺の行き先 7 int weight; // 辺の重み 8 Edge(int t, int w) : to(t), weight(w) { } 9}; 10using Graph = vector<vector<Edge>>; 11 12int main() { 13 // 頂点数と辺数 14 int N, M; cin >> N >> M; 15 16 // グラフ 17 Graph G(N); 18 for (int i = 0; i < M; ++i) { 19 int from, to, weight; 20 cin >> from >> to >> weight; 21 G[from].push_back(Edge(to, weight)); 22 } 23}
yohhoy👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

メンバ初期化子リストという機能であることはyuki23さんがすでに書かれていますが、一点注意事項があります。
初期化リストに書いた順ではなく、メンバ変数の宣言順で初期化されます、

C++

1struct Circle { 2 double m_area; // 面積 3 double m_r; //円の半径 4 Circle(double r) : m_r(r), m_area(m_r * m_r * M_PI) {} 5}; 6

のように書いてしまうと、m_areaには正しい計算結値が入りません。

constメンバ変数には代入できないので、メンバ初期化子リストを使用しないと初期化できませんね。

投稿2020/04/21 09:09

編集2020/04/21 10:29
SHOMI

総合スコア4079

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

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

Kchan_01

2020/04/21 11:16 編集

>constメンバ変数には代入できないので、メンバ初期化子リストを使用しないと初期化できませんね。 これで役割がピンと来ました。その場合、上記の書き換えはできませんね。 ありがとうございます。
guest

0

コンストラクターのメンバー初期化リストといいます
https://ja.cppreference.com/w/cpp/language/initializer_list

このような機能が必要な理由は色々ありますが、例えば以下のような理由があります

  1. あとから代入するのでは、先にデフォルトコンストラクタが呼ばれるため無駄である
  2. すべてのクラスが代入で初期化できるとは限らない

Effective C++ 第3版 第1章第4項「オブジェクトは、使う前に初期化しよう」などもご覧ください

投稿2020/04/21 08:43

編集2020/04/21 09:30
yuki23

総合スコア1448

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問