プロセス指向のC ++プログラミング

序文

C言語は、プロセス指向のプログラミング言語であり、C ++は、二つの異なるプログラミング言語であり、オブジェクト指向プログラミング言語です。C言語は、C ++は、さらに、C言語を拡張し、改善するためのC言語、C ++のスーパーセットであり、そのほとんどは、オブジェクト指向プログラミングを開発することであり、C ++のサブセットです。言語CプログラミングプロセスCは++のいずれかで設計することができるとともに、継承と多型は、オブジェクト指向プログラムの設計によって特徴付け行うことができる抽象データ型に基づく設計プログラムオブジェクトに特徴づけることができます。

「こんにちは世界!」から約ましょう話

細かい伝統的な学習のプログラミング言語を継承し、我々は記述する必要が「こんにちは、世界を!」:

#include <iostream>
using namespace std;
int main()
{
   cout << "Hello World";
   return 0;
}

カテゴリ

カテゴリC言語と同様の構造を持つユーザ定義データ型(クラス)、構造の種類、が、クラスのメンバーにいくつかの拡張だけでなく、可変であってもよく、また、クラスアウトによって定義された変数の関数であってもよいです呼ばれる特定のタイトルにもある「オブジェクトが。」ヘッダファイルであるのいずれかが宣言クラスに使用され、別の文書に書かれている二つの部分に分け、一般に入力この機能を提供し、他のファイルは、これらの操作の完全なコードを含んでいます。クラスを使用する場合、あなたは今、プログラムのヘッダファイルをインクルードする必要があります。

標準の「入力/出力ライブラリー。」

「入出力ストリーム」という名前のC ++標準の「入力/出力ライブラリー」は、入出力ストリームワードは、3つの部分、すなわち入出力ストリーム、ストリーム入出力手段から構成されています。iostreamクラスライブラリでは、入力と出力のための多くのクラスが含まれているクラスは、入力および出力端子と、ファイルをサポートしています。私たちは、含まれている必要 ヘッダファイルは、入力と出力の操作をストリーム使用することができます。

CINとCOUT

COUT(アウト参照発音)とCIN(の顕著な参照)がオペレータではなく、キーワードではありません、彼らはC ++は、内蔵されているオブジェクト(オブジェクトは良い進歩を作成しました)。CINとCOUTはostreamに及びIStreamクラスの対象となり、良い進歩を作成するための標準ライブラリの開発者が、直接使用するために使用することができます。
(ストリーム)がモードを「フロー」C ++出力及び入力にある実装、COUTは、標準出力ストリームオブジェクト、すなわちのostreamであり、CINはストリームオブジェクトCIN、COUTと流量演算オフ、標準的な入力ストリームオブジェクト、すなわちのIStreamありますデータベース入力と出力ストリームに格納されている文字の定義は、そのプログラムフローにおいてCIN、COUTと演算子を使用する場合、本文書のヘッダファイルストリームに含まれなければなりません。

「>>」と「<<」演算子

シンボル 機能
>> 出力オペレータ挿入はまた、データストリームの入力、データストリームに向けることができる、と呼ぶことができます
<< オペレータ入力はまた、抽出と呼ばれることができ、入力されたコンテンツストリームからのデータ入力のために適切な型を持つオブジェクトに向けることができます

例えば:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string name;
    cin >> name;
    cout << "Hello, " 
             << name 
             << "!" 
             << endl; 
    return 0;
}

次のような結果を操作します:

このコードでは、まず、オペレータは、入力の内容が「名前」オブジェクトに格納され、「>>」CINを使用し、我々のコンテンツの入力ストリームを格納するためのオブジェクト「ストリング」タイプを定義し私たちは期待して順に出力内容「<<」はcoutストリームに出力されます。私たちは、すべての書き込みで「裁判所未満<<」、エンドとしてENDLする出力文の出力文のシリーズに接続することができますが、いくつかのコンテンツを入力する必要がないことを確認することができます。

ENDL

endlは、C ++標準ライブラリのマニピュレータで、英語の意味は出力の終わりを意味し、出力の行の最後にある行の終わり、多くの場合、COUTの使用です。特長は以下のとおりです。

  1. 出力ストリームに改行文字、およびデバイスに関連付けられたバッファの内容を有するブラシ装置、一時的にこれまでに格納されたプログラムが実際に出力ストリームにすべて出力されていることを確認します。
  2. 出力バッファを空にします。

はい「名前空間stdを使用して」とは何ですか?

STDは標準ライブラリの名前空間の名前であり、標準ライブラリで提供されるコンテンツは、名前空間stdにカプセル化されています。ライブラリの名前空間は、メソッドの名前にカプセル化され、名前の競合をの問題を回避することができるとアプリケーションが起こります。
したがって、文字列クラスとCINを使用するために、COUTは、ヘッダファイルをインクルードするだけではなく、名前空間のstd名前空間コンテンツの露出を使用して、2つのキーワードで、プログラム内のオブジェクト。

初期化

C ++は、別の初期化する方法、または「を提供してくれますコンストラクタの構文のように、」:

int num(0);

しかし、我々は、初期化を述べ、我々がやるだろうということは自然です。

int num = 1;

もちろん、我々は問題を持っていない、我々はC言語を学ぶ際に乾燥しています。しかし、なぜC ++には、それを初期化するための別の方法を提供しますか?
例えば、C ++標準ライブラリ我々は実部と虚に同時に必要も初期化複合クラスオブジェクトを示すクラスオブジェクト複数のは、2つの部分、すなわち、実部と虚部から成る複合体クラスと呼ばれるクラスは、あります初期化セクションでは、この時間は、元の「代入演算子(=)とは、簡単に使用しないように初期化する。
解決するために、」多値初期化問題」を、C ++コンストラクタは、構文が提供されます。

#include <complex>
complex<double> purei(0,1);

引用文

参照とは何ですか

以下の文言は、基準を定義し、変数参照にそれを初期化します。

类型名 & 引用名 = 变量名

参照変数は別名で、変数の参照、この変数に相当し、。参照が変数に初期化され、あなたがまだ有効である元の変数名を指すように変数の参照名を使用することができ、あなたはまだ、変数にポイントに元の変数名を使用することができます。次の考慮事項への参照があります。

  1. ヌル参照することはできません、あなたは参照の定義を参照する変数を初期化する必要があります。
  2. 参考文献をひたむきさ、変数が初期化飲酒後に初期化されて引用されているされている、あなたは他の変数を参照することはできません。
  3. リファレンスは変数、定数を参照することができ、および式が参照することはできません。

より直感的な参照を理解するために、我々は、コードセクションを記述する必要があります。

#include <iostream>
#include <string>
using namespace std;
int main()
{
    int num1(0);
    int & num2 = num1;
    
    cout << num2 << endl; 
    
    num1 = 1;
    cout << num1 << endl; 
    cout << num2 << endl;
    
    num2 = 2;
    cout << num1 << endl; 
    cout << num2 << endl;
    return 0;
}

動作の結果、以下のように:

まず、int型のNUM1のオブジェクトを定義し、基準NUM2を定義します。各出力の後、我々は修正して、我々は、操作を参照、同じことのNUM1とNUM2 2、当社num1をnum2の操作と同等を定義した後、
NUM1とNUM2の出力データは同じです。

しばしば引用されました

constキーワードを追加する前に、定義文で、参照を定義する場合、この時間は、一定の参照を定義します。アクションは、多くの場合、コンテンツへの参照が参照により引用されていない、それが書かれています:

const 类型名 & 引用名 = 变量名
  • しばしば引用された参考文献は、内容を変更することはできませんが、コンテンツ自体は、参照を変更することがあります。

そして、非常にしばしば引用文献

そして、引用された文献は、多くの場合、非常に異なる種類があり、参照は、一定の変数の参照を初期化するために使用することができますが、多くの場合、参照は引用初期化するために使用することはできません。


我々がコミットされますプログラミングを学び始めたときにエラーを減らすことで、見てみましょう:

void swap(int a,int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

私たち、彼らは引数やパラメータの問題に関連して書き込みが、間違っているので、すべてを知っています。着信変数a、bが、機能完了すると、2つの変数が消えます、B、元のデータ、ローカル変数のコピーです。それは我々がこの問題に対処する方法でしたか?あなたはポインタ変数を介して間接的に操作することができるように我々は、関数にポインタを渡すことができます。
しかし、今、私たちはこの問題を解決するための参照を使用することができます。

#include <iostream>
#include <string>
using namespace std;

void swap(int & a,int & b);

int main()
{
    int num1(0);
    int num2(1);
    
    swap(num1, num2);
    cout << "num1 = " << num1 << endl; 
    cout << "num2 = " << num2 << endl;
    
    return 0;
}

void swap(int & a,int & b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

出力は次のとおりです。

私達は私達のように、時間の値の関数によって渡される最初の引数に参照される参照のタイプに、Bは、Bは、渡された二番目の引数を参照するであろう。定義によれば、bは、我々は、Bを操作し、この時間は、動作パラメータに相当自体を通過したそれぞれ、および2つの変数に渡されたもので、あなたがその受信したアドレスの前にしたくない、引用A。

参照とポインタ

参照とポインタは、彼らは主に3つの異なる、いくつかの類似点を持っています:

  1. リファレンスは、参照が正当なメモリに接続する必要があり、nullを参照することはできません。ポインタはNULLポインタすることができます。
  2. リファレンスがオブジェクトに初期化され、それが他のオブジェクトから参照することはできません。別のオブジェクトポインタは、いつでも指すことができます。
  3. 作成時に参考に初期化する必要があります。ポインタは、任意の時に初期化することができます。

動的なメモリ割り当て

割り当て

我们在C++中使用 new 运算符实现动态内存分配。
当我们只分配一个变量时,语法如下:

ptr = new Type

当我们分配一个数组时,语法如下:

ptr = new Type[N]
参数 说明
Type 任意类型名,可以是 class 类型
ptr Type* 类型的指针名
N 分配的数组元素个数,可以是整型表达式

使用 new 运算符之后,C++ 将分配出大小为 sizeof(Type) × N(分配变量时N为1) 的空间,并且将内存空间的起始地址赋值给 ptr 。

释放

有申请空间就一定要释放,否则会造成内存泄漏。用 new 运算符分配的内存空间需要用 delete 运算符释放。
申请变量时,释放语法为:

delete ptr;

申请指针时,释放语法为:

delete []ptr;
参数 说明
ptr 需要释放的空间的指针名,必须是动态内存分配出的空间
  • 我们无需检验 ptr 是否为空指针

new 和 malloc的区别

  1. new分配的空间不需要强制类型转换;
  2. new分配的空间不需要判空;
  3. new分配的空间时可以初始化。

缺省值

给函数参数赋默认值

在C++中,定义函数时,我们可以让最右边的连续若干个参数具有默认值,这个默认值叫做缺省值。调用参数的时候,若相应位置不写参数,那么该参数的值就会被赋值为缺省值。

实例


代码实现:

int add(int a, int b = 20, int c = 30)
{
    return a + b + c;
}

提供默认值的规则

  1. 默认值的解析操作从最右边开始。如果我们为某个参数提供了默认值,则该参数右侧的所有参数都必须具有默认值;
  2. 默认值只能指定一次,即函数声明和函数定义只能有一个地方指定默认值,不能两个地方都指定。
  • 为了提高可见性,建议默认值在函数声明的时候指定。

内联函数

为什么会有“内联函数”

当我们用函数封装代码时,函数的调用是有开销的,除了时间上的开销,频繁调用的函数也可能大量消耗栈空间。如果我们写了个功能强大的函数,这个函数有几百行,那么函数调用的开销相对会显得比较小,可以忽略不计,就好比分析卫星运行的轨道半径时不需要考虑卫星的长度参数一样。但是如果是个只有几条语句,运行速度很快的函数,例如:

这个函数的作用只是打印一条分割线,而且在程序中需要被多次调用。相比之下,这种函数被调用的开销就成为了需要考虑的因素了。

inline 关键字

为了减少函数调用的开销,C++引入了内联函数的机制。将函数声明为 inline,表示建议编译器在调用这个函数的时候,将函数的内容展开,此时编译器将会把函数的调用操作改为以一份代码副本来替代。
例如我们要输出100个“生日快乐!”:

#include <iostream>
using namespace std;

void put_a_message();

int main()
{
   for(int i = 0; i < 100; i++)
        put_a_message();
   return 0;
}

inline void put_a_message()
{
    cout << "生日快乐!" << endl;
}

当我们把 put_a_message 函数定义为内联函数时,在内部就可能是以这种方式实现功能:

#include <iostream>
using namespace std;
int main()
{
   for(int i = 0; i < 100; i++)
        cout << "生日快乐!" << endl;
   return 0;
}

使用 inline 的注意事项

1.使用限制

inline 只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数。

2.inline是一个建议

将函数定义为 inline 函数仅仅是对编译器提出的一个要求,编译器不一定执行这项要求,所以最后能否真正内联,看编译器的意思。如果编译器认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联。

3.适合定义为 inline 的函数

一般来说,最适合定义为内联函数的函数的特点为:体积小、需要被多次调用、执行的操作简单。

4.inline 函数定义

由于内联函数要在被调用的时候展开,所以编译器必须随处可见内联函数的定义,因此 inline 函数的定义常放于头文件。

5.inline 是"用于实现的关键字"

关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。

函数重载

为什么会有“函数重载”

例如我们要写3个函数,分别要求出两个整数,三个整数,两个双精度数的最大值。那么我们把这3和函数都命名为“max”是一件合情合理的事情,但是学习C语言时我们知道不同的函数时不能取相同的函数名的,这就需要我们为这3个函数分别去不同的函数名,甚至会取得又臭又长。

函数重载

我们实现一下前文的代码:

#include <iostream>
using namespace std;
int myMax(int a, int b) 
{
    return (a > b ? a : b);
}

int myMax(int a, int b, int c)
{
    b > a ? a = b : a = a;
    return (a > c ? a : c);
}

double myMax(double a, double b)
{
    return (a > b ? a : b);
}

int main()
{
    cout << myMax(3,4) << endl;
    cout << myMax(3,4,5) << endl;
    cout << myMax(4.3,3.4) << endl;
}

C++允许我们写出好几个具有相同函数名的函数。一个或多个函数名相同,但是函数个数或参数类型不同的函数,叫做函数重载。
函数重载使得函数命名变得简单,在调用函数的时候,编译器会将调用函数时提供的实际参数和每个重载函数的参数对比,判断应该调用哪个函数。

  • 编译器无法根据函数的返回类型来区分两个函数名相同的函数。

函数指针

指向函数的指针

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。语法为:

Type (*ptr)(list);
参数 说明
Type 函数的返回值的类型
ptr 指针变量名
list 调用函数时传递的参数表

在函数指针变量赋值时,只需给出函数名,不必给出参数。函数指针变量指向的函数不是固定的,这表示定义了一个这样类型的变量,用来存放函数的入口地址,函数指针指向的函数由我们在程序中把哪一个函数的地址赋给它而决定。

实例


代码实现:

参考资料

《新标准C++程序设计》————郭炜 编著,高等教育出版社
《Essential C++》————[美]Stanley B.Lippman 著,侯捷 译,电子工业出版社
C++里面的iostream是什么
C++构造函数初始化类对象
C++ new和malloc的区别
C++函数指针详解
菜鸟教程
C语言中文网

おすすめ

転載: www.cnblogs.com/linfangnan/p/12294970.html