0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[C++]主要な文法メモ

Last updated at Posted at 2019-03-29

C++の文法メモ

C++を勉強しようと思ったけれど文法が難しい。
自分のために文法のメモを残す。

クラス

クラスの基本的な概念は様々な資料がありますのでここでは省略致します。
取り急ぎ変数と処理をひとかたまりのプログラムにまとめたものをクラスと呼びます。

~執筆中

テンプレート

変数やクラスの型が変わっても一つの関数やクラスで処理を実行するための機能

テンプレート関数

関数の引数や戻り値の型が変わっても対応できるようにする
一旦、何が入るかわからない仮の型を宣言しファンクションを作成する。
ファンクションを使用するときに引数や戻り値の型が決定されるようにプログラムする。

関数の引数を仮の型にする

template
template<class 任意型名>  //この任意型名が仮の型になる
 関数名(任意型名 引数)   
{
 ~コマンド~
}

引数aに1をプラスするプログラムを作って挙動を確認してみます
引数aの型をintとdoubleのどちらが来ても計算できるようにします

Example_template.cpp

template<class T> //なんでもよい型Tを宣言
int add(const T c) //引数の型は何でもよいT、戻り値は整数で固定
{
	return c + 1;
}

int main()
{
	//整数
	int a=1;
	std::cout << add(a) << "\n";

	//実数
	double b = 1.5;
	std::cout << add(b);
}

関数の戻り値も仮の型にする

template2
template<class 任意型名>
任意型名 関数名(任意型名 引数)
{
 ~コマンド~
}

引数aに1をプラスするプログラムを作って挙動を確認してみます
引数と戻り値の型をintとdoubleのどちらが来ても計算できるようにします

Example_template.cpp

template<class T>
T add(const T c) //戻り値の型をTにしました
{
	return c + 1;
}

int main()
{
	int a = 1;
	std::cout << add(a) << "\n";

	double b = 1.0;
	std::cout << add(b) << "\n";
}
ダメな例

引数と戻り値の型を別々にするとエラーになります
多分戻り値の型が決まらないから?

Example_templateError.cpp
//引数の型はT、戻り値の型はU
template<class T>
template<class U>
U add(const T c)
{
	return c + 1;
}

//mainはExample_template.cppと同じ
重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
エラー	C2568	'<<': オーバーロード関数のうち、どれを呼び出すのか決定できません。	
エラー	C2568	'<<': オーバーロード関数のうち、どれを呼び出すのか決定できません。	
エラー	C2065	'add': 定義されていない識別子です。	
エラー	C2065	'add': 定義されていない識別子です。
エラー	C3857	'add': 複数の テンプレート パラメーター リストは使用できません	
エラー (アクティブ)	E0777	この宣言では複数の 'template <...>' 句を使用することはできません	

追記
コメントにてaeioaeu様から正しい方法をお教えいただきました!
aeioaeu様本当にありがとうございます。

  • templateの宣言は二つの任意型をカンマで区切らないといけませんでした
  • ファンクションを呼び出すときに戻り値の型を指定しないといけませんでした
Example_template2.cpp
template<class U, class T>  //templateの宣言は二つの任意型をカンマで区切って宣言
U add(const T c)
{
	return c + 1;
}


int main()
{
	int a = 1;
    std::cout << add<int>(a) << "\n";   //addファンクションを使うときに<>内に戻り値の型を指定する

	double b = 1;
	std::cout << add<double>(b) << "\n";  //addファンクションを使うときに<>内に戻り値の型を指定する
}

テンプレートクラス

クラスにもテンプレートが使用できます

メソッドの引数を仮の型にする

template<class 任意型名>
class クラス名{
    public:メソッドの戻り値の型 メソッド名(任意型名 引数){
        ~コマンド~
}

int main(){
    クラス名<任意型名> インスタンス名;

    ~コマンド~
}
templateClass
//引数aに1をプラスするプログラム
//引数と戻り値の型をintとdoubleのどちらでも良いようにする

#include <iostream>

template<class T>
class add {  
public:int oneAdd(T c) {  //メソッドの戻り値はint、引数はインスタンスに依存
	return c + 1;
}
};

int main()
{
	int a = 1;
	add<int> add1;
	std::cout << add1.oneAdd(a) << "\n";
}

継承

執筆中

0
1
4

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?