C ++ベーシック
キーワード
たくさんありますが、多くはありません
名前空間
hello worldを書いたので、気づきました
using namespace std;
プレゼンス。私の理解では、名前空間は、多くのフォルダーを作成し、変数、関数、およびクラス(クラスとは何ですか?)を論理的にグループ化して、名前の競合を(文字通り)回避するようなものです。
namespace N1
{
\\在命名空间中定义变量
int a;
\\在命名空间中定义函数
int Nothing(int a)
{
return a;
}
\\在命名空间中嵌套命名空间
namespace N2
{
int b;
}
}
\\同名空间将被在编译时合并
namespace N1
{
int c;
}
名前空間を使用する3つの方法
N::a;
using N::b;
using namespace N;
C ++の入力と出力
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello world!"<<endl;
}
coutとcinは、iostreamヘッダーファイルとstd名前空間に含まれています。C ++の入力と出力は、データ形式の制御を強化する必要がないので、かっこいいです。
デフォルトパラメータ
完全に機能する関数には、呼び出されるたびに渡す必要のない多くのパラメーターが含まれていることがよくあります。したがって、そのようなパラメータにデフォルト値を割り当てると、問題を回避できます。半デフォルトパラメータの場合、デフォルトパラメータは右から左に配置する必要があります。
void test(int a, int b =0, int c = 0)
{
cout<<a<<endl<<b<<endl<<c<<endl;
}
コンパイラーを混乱させないために、デフォルトのパラメーターは定義と宣言に同時に表示されません。また、デフォルト値は定数またはグローバル変数である必要があります。
関数のオーバーロード
同じスコープ内で、C ++は、類似した関数を持つ同じ名前の複数の関数が存在することを許可し、それらの仮パラメーターリストは異なっている必要があります。このような設計は、複数のデータ型が一意でない状況を処理できます。C ++では、最下層のグローバルな一意性を確保するために、より複雑な名前変更方法を使用してC言語を教え、関数パラメーターのタイプやその他の情報も含まれています。したがって、同じ名前の関数を使用する場合は、それらの仮パラメーターリストが同じでないことを確認する必要があります。
見積もり
参照は、参照されるオブジェクトと同じメモリ空間を共有する、参照される変数のエイリアスを取得することです。
特定の要件:1。定義を初期化する必要があります。2。変数に複数の参照を含めることができます。3。参照が確立されると、他のエンティティを参照できなくなります。
int a = 10;
int& ra = a;
int& rra = a;
const int b = 10;
const int& rb = b;
const int& rc = 10;
double d = 3.14;
const int& rd = d;
//这样的引用方式的结果是d和rd的地址不一样,d和rd的地址之差恒定(与数据类型组合有关)
参照は、関数のパラメーターとして、または戻り値として使用できます。関数が参照を返すと、実際には戻り値への暗黙のポインタが返されます。このようにして、関数を代入ステートメントの左側に配置し、戻り値を追跡可能に変更できます。
現在のテストでは、参照の効率がポインターの効率よりも高いことがわかりました。次のプログラムは、関数の戻り値としてのポインターと参照の効率を比較します。
#include <iostream>
#include <time.h>
#include <Windows.h>
using namespace std;
struct A
{
int a[10000];
};
A a;
A Test1()
{
return a;
}
A& Test2()
{
return a;
}
void Test()
{
size_t begin1 = clock();
for (size_t i = 0; i < 100000; ++i)
Test1();
size_t end1 = clock();
size_t begin2 = clock();
for (size_t i = 0; i < 100000; ++i)
Test2();
size_t end2 = clock();
cout << "Pointer time\t" << end1 - begin1 << endl;
cout << "Reference time\t" << end2 - begin2 << endl << endl;
}
int main()
{
for (int i = 0; i < 10; ++i)
{
Test();
}
Sleep(10000);
return 0;
}
個人的な理解:ポインタはアドレスを格納するために別のメモリを作成する必要があるため、物理的なスペースがない参照よりも効率が低くなります。
constと参照
参照は、同じ人(int)に対して、異なる名前(a、ra、rra)を持ち、一部の名前は変数プロパティ(int&ra = a;)、一部の名前は定数プロパティ(const int&rra = a;)のようなものです。 。彼の変数名(ra)を呼び出すと、髪を切ったり、整形手術を受けたり、腕や脚を外したりできます。彼の定数名(rra)を呼び出すと、彼はキングコングの腐敗しない体です。ただし、これらの場合、新しいメモリ領域は表示されません。実体はまだ彼の人(int)です。
int a = 10;
int& ra = a; //起个外号
const int& rra = a; //再起个外号
a = 11;
ra = 12; //你可以随便改它
//rra = 13; //此时你无法伤害它
さらにひねくれたのは、(const double rrra = a;)によって、人間としての彼のこの属性を変更して、彼をサルに変えることができるということです。次に、この時点で、別のアドレスに保存された新しいエンティティが表示されます。この名前(rrra)を呼び出すと、あなたを振り返る猿がいて、この人はあなたを無視します。しかし、この猿は朽ちることのない体です。興味深いことに、サルの住所はランダムに表示されませんが、人の住所と一定の住所ギャップを維持します。このアドレスギャップは、データ型の組み合わせ(intとdouble、またはcharとint)によって異なります。
const double& rrra = a;
printf("%d\n", &a);
printf("%d\n", &rrra);
//此时输出值会有差异,差异恒定,输出值随机
私が予想していなかったのは、人々をサルに変えるこのプロセスを繰り返すと、最初のサルに新しい名前を付けるのではなく、2番目のサルを作成するということでした。もちろん、2番目のサルに新しい名前を付けることもできますが、これは驚くことではありません。また、人を鶏に、鶏を猿に、猿を人間に変えることもできます。そして、この新参者は新しい住所を持ちます。