底辺SEによる転職のためのスキルアップメモ

うだつの上がらないSEの勉強記録です

C++勉強メモ~新・明解C言語 ~入門編その6~

出張だったため先週の金曜日より進捗が無かった。

今日は10章。

 

private, publicの使い方程度はなんとか理解した。

しかし、インデントの付け方をどうしようか迷う。

class Account {

};

みたいにするか

class Account 

{

};

みたいにするか

 

うちの会社のコーディングルールを厳しく順守するなら後者なのだが

見やすさの観点からは前者で書くべきだよなと。

まあ、うちの会社はC++で作る製品今の所無いからこんな心配することはないのだが。

 

コードを書き写している間は色々インデントを試したが

class Account {

private:

      string aaaa;

public:

      long bbbb;

};

 

みたいな教科書通りの書き方が一番書きやすいかなと思った。

 

 

コンストラクタ=初期化

と考えてれば今のところは良さそう?

 

ちょっとクラスは参考ソースコード無しじゃ書けなさそう。

Cはやってたのでポインタアレルギーは無くなりつつあるが

クラスという新しい概念にポインタ混ぜられたらごっちゃになって今日の所は理解が及ばなかった。

 

とりあえず打ち込む作業まではできたので

理解できるまで読み込むかは1周してから考えることにする。

 

周りの意見を聞くところ

同じソースを何回も打つより、英語みたいに違うソースをチラ読みしながら、流れ把握2割打ち込み8割みたいな感じでやってった方が上達は早いんじゃないかなと思っている。

そのため細かいことは気にせずに理解できてなくても次へ進もうと思う。

C++勉強メモ~新・明解C言語 ~入門編その5~

9時まで残業だったため9章のみ。

 

関数テンプレートは使い方慣れないとダメそう。

そらじゃ書けない。

 

型を自動判別するって考え方はなるほどなと思った。

Cだとその辺の処理を作ろうとしたら、明示的にキャストするかそもそも構造体使ってType型みたいなの作るかしか無かったもんな。

 

分割コンパイルは、会社だと統合開発環境でちゃちゃっとやっちゃうから意識してなかったが、コマンドプロンプトで直打ちすると大分めんどいなという印象。

g++ -c List9-5.cpp -o List9-5.o

g++ -c List9-6.cpp -o List9-6.o

g++ List9-5.o List9-6.o -o List9-5-6

List9-5-6

真面目に書くとこんな感じのコマンド打たなきゃならないから結構面倒。

 

 

名前空間

構造体のメンバを参照する「.」演算子みたいに関数にアクセスできるみたいな?感じか。

::を

名前空間名:: とかにして

namespace 名前空間名 { ・・・ } にアクセスする、という雰囲気は伝わった。

 

using指令とかの解説が書いてあったが、あまり理解できず。

これの詳細理解できてなきゃプログラミングできないという訳でも無いだろうと思うので、とりあえずスルー。

 

明日からはようやっとC++の特徴であるクラスの章へ入れる。

 

C++勉強メモ~新・明解C言語 ~入門編その4~

残業無しだったため7章、8章に取り組んだ。

ポインタはC言語を業務で使っているため別段理解が難しい所は無かった。

しかし、C++になったことで気になる点などはあった。

 

1.newとdelete

C++だとmallocとかcallocは使わないのかな。

newとdeleteだけでメモリの確保と解放は十分なのか。

 

2. #inlucde <new>

C言語じゃ使ったことがないライブラリだ。

try{ ・・・ }

catch(bad_alloc) { ・・・ }

何となくやろうとしていることは分かるが

細かい使い方は分からん。

例外処理らしいが、とりあえずbad_allocを受け取ったら終了すると覚えとけばいいか。

 

3.charのエラー

ポインタで文字列を

char* ptr = "123";

みたいに定義すると、MinGWだと警告が出た。

constつけるとで警告は消える。

原因は、C++は文字列リテラルの変更を許さない仕様にあるようだ。

123という文字列リテラルはconst char*だが、上のような定義を行った場合

暗黙の型変換が行われ、char* になるようだ。

C++は型変換に関してかなり厳しく見るようで

型変換したことを警告として出しているみたい。

 

3.NULL

C++だと

#define NULL (void *)0

とするとエラーが起こるようだ。

知らなかった。

 

4.配列

C言語と異なり、C++はライブラリを使うことが多い?

まあ、入門編だからそうなだけなのかもしれないが。

 

会社のコードはかなり古いので、ポインタをゴリゴリ使って

stringヘッダなんか使わないことが多いからなぁ。

 

ヘッダでライブラリ読み込ませて使おうという

C++の考え方には慣れて行かなければと思う。

 

 

内容的にC言語と被る内容から徐々にC++特有の知識の章に突入しそう。

次やる本もそろそろ選定しておきたい所。

C++勉強メモ~新・明解C言語 ~入門編その3~

今日も残業。

会社出たのが9時過ぎだったため、6章まで進める作業で手一杯だった。

 

今までC言語しかロクに扱って来なかったので、割と違いに戸惑った。

1.デフォルト実引数

int max( int a = 3 )

{

   return a;

}

みたいな記述の仕方ができる。

しっかしなぁ。

これでmax(5);

とかで関数呼んだら戻って来るの5なんだよな?

使いづらいんじゃないかと思ってしまう。

 

それに、max( int a = 3, int b )

とかで宣言するとコンパイルエラーが出るようだ。

何でかは分からんが厄介だ。

 

今のところはこんなもんとして一旦しまっておくことにする。

後でも積極的に出てくんのかな?

だとしたら素直に理解しないとダメそうだが・・・。

 

2.参照渡し

int&

という書き方に馴染みが無い。

C言語の教科書に、参照渡しの場合はどうなるとか色々書いてあったことは覚えているので、2つの値をswapする関数ぐらいなら分かるが、やはり実引数の値が書き換えられる可能性があるってのはなんだか慣れない。

C++の根幹を為すクラスの概念は、参照渡しを多用するため、なんとか理解していかねば。

 

3.値の有効範囲

for文内で宣言した変数の記憶寿命がfor文内だということは知らなかった。

教えられたことはあったかもしれないが、忘れてた。

 

4.多重定義・インライン関数

1例でしか触れなかったが、今まで教科書進めて来て初めての新しい要素。

シグネチャが異なっていれば多重定義できない

シグネチャって何だよ。

 

とりあえず引数の個数が違うだけだったら宣言できそうだという印象を受けた。

この部分にあんまり詳しい説明も無いので

そういうものだと思って今はスルーすることにする。

どうせ後で出て来るだろう。

 

C++勉強メモ~新・明解C言語 ~入門編その2~

残業だったため6章のList6-11まで

 

1.5章の見直ししていて思ったこと

 

よくC言語の授業とか受けたり、その手の本とか読むと

gotoとcontinueはなるべく使わないようにとかの記述がある。

まあ、今までの処理の流れを完全無視して飛ばすorスキップするんだから

普通使わないよな、と今までは理解していた。

 

会社の先輩も、gotoとかcontinueがC言語に残ったのは、昔のUNIXとかBASICであったから残ってるだけで、普通使わんと言っていた。

会社のソースコードの中にcontinue文ある関数あったから思い出したというだけです。

 

2.コーディングルールの違い

会社によってはルール自体が特にないこともあるけど

個人的には、ifがあったらelseが無いのは気持ち悪い。

ifがあってelse if があるならelseが無いのは気持ち悪い。

 

後、インデントは

if ( a == 1 )

{

     a += 1;

}

のようになっていないと気持ち悪い。

 

まあ、この程度は好き好きか。

 

3.main関数

①多重定義できない

②インライン関数として定義できない

③再起呼出しは行えない

④アドレスを取得できない

 

C++で③と④の制限あるのは知らなかった。

C言語だと③と④の制限ないのも知らなかった。

 

C++勉強メモ~新・明解C言語 ~入門編その1~

書籍:新・明解C言語 入門編 の勉強を開始

1~5章までとりあえず読んで、コードを打ちこんで実行してみた。

 

気になったこと。

1.Shift-Jis問題

MinGWUTF-8コンパイルしているため

全角文字のcoutでエラーが出る。

回避するためには、オプションに

-finput-charset=CP932 -fexec-charset=CP932

を追加すれば良いようだ。

 

2.main関数の引数問題

Undefined WInMain()~

みたいなコンパイラエラーが出る。

 

int main()

の引数に何もない時に起こるエラーのようだ。

int main( int argc, char *argv[] )

と、コマンドライン引数に何らかの値を入れてあげたら解決。

詳しい理由は分からない。

とにかく解決したのでエラー出るときはこれを書いてみることにした。

 

C言語については初学者という訳では無いため

C++特有の cout << , cin >> のような書き方には戸惑った。

後は#include <typeinfo> のようなC言語の教科書のはじまりとしてはあまり出てこないようなインクルードマクロがあるのには結構驚いた。

 

明日以降は6章

インライン関数とかC言語では無かった要素が少しずつ出て来る模様。