#include <iostream>
#define NUMBER 256
#define HELLO(name) std::cout << "Hello " << name << "." << std::endl;
int main()
{
std::cout << NUMBER << std::endl;
HELLO("Jane")
HELLO(NUMBER)
return 0;
}
256
Hello Jane.
Hello 256.
define の部分は別のファイルとして分けることができます。
#define NUMBER 256
#define HELLO(name) std::cout << "Hello " << name << "." << std::endl;
そして、define.cpp を次のように変更します。
#include <iostream>
#include "define.h"
int main()
{
std::cout << NUMBER << std::endl;
HELLO("Jane")
HELLO(NUMBER)
return 0;
}
コンパイルの方法は同じです。
g++ define.cpp
複数の .cpp ファイルがあるときは、g++の後に、空白で区切って .cpp ファイルを連記しますが、ヘッダーファイル(.h)は記述しません。
256
Hello Jane.
Hello 256.
さらに、プログラムのスターティングポイントである main( )関数全体も define することもできます。
#define HELLO(name) int main()\
{\
std::cout << "Hello " << name << "." << std::endl;\
return 0;\
}
#include <iostream>
#include "define.h"
HELLO("John")
Hello John.
#include <iostream>
enum DIRECTION
{
LEFT = 101,
TOP = 202,
RIGHT = 303,
BOTTOM = 404,
};
int main()
{
std::cout << LEFT << "\t";
std::cout << TOP << "\t";
std::cout << RIGHT << "\t";
std::cout << BOTTOM << std::endl;
return 0;
101 202 303 404
列挙子に、初期値が与えられない場合は、0からの連番になります。
#include <iostream>
enum DIRECTION
{
LEFT ,
TOP ,
RIGHT ,
BOTTOM ,
};
int main()
{
std::cout << LEFT << "\t";
std::cout << TOP << "\t";
std::cout << RIGHT << "\t";
std::cout << BOTTOM << std::endl;
return 0;
}
0 1 2 3
最初の列挙子や、途中の列挙子に、特定の値を設定すると、次の列挙子は、その値の +1 になります。
#include
enum DIRECTION
{
LEFT = 100,
TOP ,
RIGHT = 200,
BOTTOM ,
};
int main()
{
std::cout << LEFT << "\t";
std::cout << TOP << "\t";
std::cout << RIGHT << "\t";
std::cout << BOTTOM << std::endl;
return 0;
}
100 101 200 201
enum もファイルを分けることができます。
enum DIRECTION
{
LEFT = 100,
TOP ,
RIGHT = 200,
BOTTOM ,
};
#include <iostream>
#include "enum.h"
int main()
{
std::cout << LEFT << "\t";
std::cout << TOP << "\t";
std::cout << RIGHT << "\t";
std::cout << BOTTOM << std::endl;
return 0;
}
コンパイルする時には、ヘッダーファイル(enum.h)は記述しません。
g++ enum.cpp
100 101 200 201
#include <iostream>
#define NUM "0"
int main()
{
if (NUM)
{
std::cout << NUM << " is not zero." << std::endl;
} else {
std::cout << NUM << " iz zero." << std::endl;
}
return 0;
}
0 is not zero.
そこで、const キーワードを使った定数定義に変えてみます。
#include <iostream>
const int NUM = "0"; // ここが変更されています。
int main()
{
if (NUM)
{
std::cout << NUM << " is not zero." << std::endl;
} else {
std::cout << NUM << " iz zero." << std::endl;
}
return 0;
}
次に、エラーで指摘された点を修正します。
#include <iostream>
const int NUM = 0; // ここが修正されています。
int main()
{
if (NUM)
{
std::cout << NUM << " is not zero." << std::endl;
} else {
std::cout << NUM << " iz zero." << std::endl;
}
return 0;
}
0 iz zero.
#include <iostream>
class Human
{
protected:
std::string name;
public:
Human(std::string name) : name(name) {}
void Iam()
{
std::cout << "I am " << name << "." << std::endl;
}
void Name(std::string name)
{
this->name = name;
}
};
int main()
{
Human man("M1");
man.Name("Bob");
man.Iam();
Human *woman = new Human("F1");
woman->Name("Mary");
woman->Iam();
delete woman;
return 0;
}
I am Bob.
I am Mary.
上記のプログラムの manオブジェクトとwomanオブジェクトに constキーワードをつけると、そのオブジェクトのメンバ変数は、 コンストラクタによる初期設定以外では変更できなくなります。
#include <iostream>
class Human
{
protected:
std::string name;
public:
Human(std::string name) : name(name) {}
// メンバ関数の先頭ではなく()の後ろにconstをつけます。
void Iam() const
{
std::cout << "I am " << name << "." << std::endl;
}
// メンバ変数を変更するメンバ関数にはconstをつけられません
void Name(std::string name)
{
this->name = name;
}
};
int main()
{
const Human man("M1");
//man.Name("Bob"); // constのついていないメンバ関数は呼び出せません
man.Iam();
const Human *woman = new Human("F1");
//woman->Name("Mary"); // constのついていないメンバ関数は呼び出せません
woman->Iam();
delete woman;
return 0;
I am M1.
I am F1.
#include <iostream>
int plusOne(const int num);
int main()
{
std::cout << plusOne(100) << std::endl;
return 0;
}
int plusOne(const int num)
{
//return ++num; これはエラーです。
return num + 1;
}
101
#include <iostream>
void plusOne(const int * num);
int main()
{
int num = 100;
plusOne(&num);
std::cout << num << std::endl;
return 0;
}
void plusOne(const int * num)
{
//++*num; これはエラー
std::cout << *num + 1 << std::endl;
}
101
100