最終更新 2024.04.01
#include <fstream>
入力
ifstream infs
infs.open("fname");
if ( infs.is_open() == 0 ) errmsg("cannot open\n");
ch = infs.get();
if ( ch == NULL ) break;
infs.getline(str,maxlen);
if ( infs.eof() == true ) break;
infs >> nx >> ny;
infs.close();
--------------------
出力
ofstream outfs;
outfs.open("fname");
if ( outfs.is_open() == 0 ) errmsg("cannot open\n");
outfs.put(ch);
outfs << "string" << a << endl;
outfs.close();
fp.clear(); <-- これを怠ると EOF になっているとき、先頭に戻らない fp.seekg(0);
sub(int& a)
{
a = 2;
}
int a;
sub(a);
#include <complex>
using namespace std;
main()
{
complex<double> a;
a = complex<double>(2,3);
printf("%f %f\n",a.real(),a.imag());
}
string str,str2,str3;
str = "yabu";
str2 = "tetsuro";
str3 = str + str2;
printf("%s",str3.c_str());
a = min(b,c) ----> a = ?
コンストラクタを作成しない場合は、デフォルトの 引数無しコンストラクタがコンパイラによって作成される。 コンストラクタを1つでも作成した場合は、 それ以外のコンストラクタは作成されない。 例えば、引数を1つ持つコンストラクタを宣言したとき、 引数無しコンストラクタは作成されない。
先祖のコンストラクタから順番に呼ばれる。
デフォルトでは先祖の引数なしコンストラクタが呼ばれる。
先祖のコンストラクタを選びたい場合は、以下のように記述する。
以下のサンプルプログラムを変更して理解すること。
#include <stdio.h>
class senzo {
public:
senzo();
senzo(int input);
private:
};
senzo::senzo()
{
printf("senzo : empty constractor\n");
}
senzo::senzo(int input)
{
printf("senzo : argument constractor\n");
}
class musuko : public senzo{
public:
musuko();
musuko(int input);
private:
};
musuko::musuko() : senzo(1) // <-- これを省略すると senzo() を呼ぶ
{
printf("musuko : empty constractor\n");
}
musuko::musuko(int input) : senzo(input) // <-- これを省略すると senzo() を呼ぶ
{
printf("musuko : argument constractor\n");
}
main()
{
musuko a;
musuko *b;
b = new musuko(3);
}
先祖クラス shape で rect, circle などを統一的に扱う方法。
以下のサンプルプログラムを参照。
#include <stdio.h>
class senzo {
public:
virtual void func(); // <--- この virtual がないと、先祖の func を読んでしまう
private:
};
void senzo::func()
{
printf("senzo : func()\n");
}
//---------------------
class musuko : public senzo{
public:
void func();
private:
};
void musuko::func()
{
printf("musuko : func()\n");
}
main()
{
senzo *s;
musuko a;
s = &a; // 先祖のポインタを使う
s->func(); // どちらの func を呼ぶ?
}
サブルーチンにオブジェクトを値渡しするとき、 戻り値に静的なオブジェクトを指定する場合、 コピーコンストラクタが呼ばれる。 クラス内の静的な変数は問題ないが、コンストラクタにおいて malloc した変数領域がある場合、デフォルトのコピーコンストラクタ ではポインタがコピーされる。それでは、サブルーチンから 戻った場合などのときにデストラクタが呼ばれた際に、 malloc した領域が free されてしまい、問題が生じる。 このため、コピーコンストラクタを自前で書き、その中で malloc して領域を確保し、領域をコピーする必要がある。 サブルーチンへの値渡しや値戻しを禁止する場合は、 コピーコンストラクタをプライベートにする。
次の表現は等価である。
c_ptr = &c_obj
c_ptr->member;
(*c_ptr).member;
サンプルプログラム
#include <stdio.h>
class myclass
{
public:
int aa;
};
int main()
{
myclass ins;
myclass *list[3];
list[0] = &ins;
ins.aa = 2;
printf("%d\n",list[0]->aa);
printf("%d\n",(*list[0]).aa);
}
.h の中に全て書く場合は以下のように書く
class YKinect{
int i;
func1(){
}
};
.cpp と .h に分けて書く場合は以下のように書く
.h
class YKinect{
int i;
func1();
};
.cpp
YKinect::func1(){
}
struct_name variable_name = { 0 };
全ての要素に 0 が入る。
.h に以下のように書く #ifndef __label__ #define __label__ インクルードファイルの内容 #endif
void func(int a, int b = 3){
printf("a = %d b = %d\n",a,b);
}
main(){
func(1,2);
func(1);
}
#include <Windows.h>
SYSTEMTIME t;
GetLocalTime(&t);
prev_time = t.wHour * 3600 + t.wMinute * 60 + t.wSecond;
a = t.wMilliseconds;