C++ベース(一)C++によるC言語の強化
31511 ワード
文書ディレクトリ変数定義の位置は、定義 に従うことができる.2グローバル変数の検出能力強化 3 structを使用する場合structキーワード を使用する必要はありません.4 boolタイプ を追加5 constの強化 5.1ポインタにより定数値 を間接的に変更することはできない. 5.2さらにconstのいくつかの基礎知識 を引用する 5.3 c言語のconstは偽物 です. 6列挙補強 7ネーミングスペース 7.1ネーミングスペースの使用 (1)直接std::cout方式 (2)using namesapce std方式 を用いる(3)std::cout を使用 7.2カスタムネーミングスペース (1)ネーミングスペース を定義する(2)ネーミングスペースネスト 8 C++のすべての変数と関数には、タイプ が必要です.(1)c++中型検出補強 (2)c言語におけるint f()は、任意のパラメータを受信する関数 を表す.(3)c言語ではint f(void)は無パラメトリック関数 を表す.9三目演算子機能強化 1変数で定義された位置は、定義に従って使用できます.
変数定義の場所は、定義に従って使用できます.
c言語の初期バージョンでは、ランダム定義はサポートされていません
2グローバル変数の検出能力強化
1つの変数は、宣言または定義にかかわらず、1回のみ表示されます.
3 structを使用する場合structキーを使用する必要はありません
4 boolタイプを追加
印刷結果
5 constの強化
5.1ポインタで定数値を間接的に変更できない
出力結果
5.2さらにconstの基礎知識を引用する
例:
出力結果
5.3 c言語のconstは偽物です
C言語のconstは偽物であることを記録したいのですが、実際にはC言語でもconst修飾の変数の値を修正することはできません.理論的にC言語ではconst修飾の変数の値をポインタで間接的に修正できるが、実際にはテストできない.
印刷結果
6列挙強化
c言語における列挙の本質は整型であり,列挙変数は任意の整形賦値c++でint値をenumタイプに直接付与することはできず,列挙要素で初期化するしかない.
印刷結果
7ネーミングスペース
7.1ネーミングスペースの使用
(1)直接std::cout方式
出力結果
(2)using namesapce std方式の使用
出力結果
(3)std::coutの使用
出力結果
7.2カスタムネーミングスペース
(1)ネーミングスペースの定義
出力結果
(2)ネーミングスペースネスト
出力結果
8 C++のすべての変数と関数にタイプが必要です.
(1)c++中型検出補強
(2)c言語におけるint f()は任意のパラメータを受信する関数を表す.
出力結果
(3)c言語ではint f(void)は無パラメトリック関数を表す
c++では,int f()とint f(void)は同じ意味を持ち,いずれもintの戻り値を表す無パラメータ関数である.
9三項演算子の機能強化 C言語では三目演算子は変数の値を返すので、左直 としては使用できません. C++言語は変数そのものを返すので、左の値 とすることができる.
出力結果
原理:C++コンパイラはアドレスを取る操作をしました
変数定義の場所は、定義に従って使用できます.
#include
using namespace std;
int main(void){
int i = 10;
for(int i = 0; i < 10; i++){
cout << "i = " << i << endl;
}
return 0;
}
c言語の初期バージョンでは、ランダム定義はサポートされていません
2グローバル変数の検出能力強化
int g_val;
// int g_val = 10; error: Redefinition of 'g_val'
int main(void){
return 0;
}
1つの変数は、宣言または定義にかかわらず、1回のみ表示されます.
3 structを使用する場合structキーを使用する必要はありません
struct teacher{
int age;
char name[64];
};
int main(void){
teacher t1;
//c struct teacher t1; :Must use 'struct' tag to refer to type 'teacher'
return 0;
}
4 boolタイプを追加
#include
using namespace std;
int main(void){
//1 bool 0 1
bool flag = true;
cout << " flag = " << flag << endl;
//2 bool
cout << "sizeof(flag) = " << sizeof(flag) << endl;
//3 bool 0 , 1
flag = 10;
cout << "flag = " << flag << endl;
}
印刷結果
flag = 1
sizeof(flag) = 1
flag = 1
5 constの強化
5.1ポインタで定数値を間接的に変更できない
#include
int main(void){
//1 c++ const, a , a
const int a = 10;
int *p = (int*)&a;
// c const
*p = 20; // *p , a
printf("a = %d
", a);
return 0;
}
出力結果
a = 10
5.2さらにconstの基礎知識を引用する
//1
const int a;
//2
int const b;
//3 c ( , )
int const * c;
//4 d ( , )
int * const d;
//5 ( , )
const int * const e;
例:
#include
int main(void){
//1
const int a = 10;
//a = 5;//error:Cannot assign to variable 'a' with const-qualified type 'const int'
//2
int const b = 20;
//b = 20;//error:Cannot assign to variable 'b' with const-qualified type 'const int'
//3 c
int c_value = 30;
const int *c = &c_value;
printf("*c = %d
",*c);
//
c = &b;
printf("*c = %d
",*c);
//
//*c = 40; error:Read-only variable is not assignable
//4 d
int d_value = 50;
int * const d = &d_value;
*d = 60;
//
printf("d_value = %d
", d_value);
//
//d = &c_value; //error:Cannot assign to variable 'd' with const-qualified type 'int *const'
return 0;
}
出力結果
*c = 30
*c = 20
d_value = 60
5.3 c言語のconstは偽物です
C言語のconstは偽物であることを記録したいのですが、実際にはC言語でもconst修飾の変数の値を修正することはできません.理論的にC言語ではconst修飾の変数の値をポインタで間接的に修正できるが、実際にはテストできない.
int main(void){
const int a = 10;
printf("a = %d
", a);
int *p = &a;
*p = 20;
int array[a] ={10,20};
printf("a = %d
", a);
printf("*p = %d
", *p);
printf("array[1] = %d
", array[1]);
return 0;
}
印刷結果
a = 10
a = 10
*p = 20
array = 20
6列挙強化
c言語における列挙の本質は整型であり,列挙変数は任意の整形賦値c++でint値をenumタイプに直接付与することはできず,列挙要素で初期化するしかない.
#include
using namespace std;
enum season{
SPR,
SUM,
AUT,
WIN
};
int main(void){
enum season s = SPR;
cout << "s = " << s << endl;
// s = 0; error:Assigning to 'enum season' from incompatible type 'int'
s = SUM;
cout << "s = " << s << endl;
return 0;
}
印刷結果
s = 0
s = 1
7ネーミングスペース
7.1ネーミングスペースの使用
(1)直接std::cout方式
#include
#include
int main(void){
std::cout << "hello world" << std::endl;
return 0;
}
出力結果
Hello world
(2)using namesapce std方式の使用
using namespace std;
int main(void){
cout << "Hello world" << endl;
return 0;
}
出力結果
Hello world
(3)std::coutの使用
using std::cout;
int main(void){
cout << "Hello world" << std::endl;
return 0;
}
出力結果
Hello world
7.2カスタムネーミングスペース
(1)ネーミングスペースの定義
namespace China {
int peopleSize = 14;
}
using namespace std;
int main(void){
using namespace China;
std::cout << " China::peopleSize = " << China::peopleSize<< std::endl;
return 0;
}
出力結果
China::peopleSize = 14
(2)ネーミングスペースネスト
namespace China {
int peopleSize = 14;
namespace HeiBei{
int peopleSize = 5;
}
}
using namespace std;
int main(void){
using namespace China;
std::cout << " China::HeiBei::peopleSize = " << China::HeiBei::peopleSize<< std::endl;
return 0;
}
出力結果
China::HeiBei::peopleSize = 5
8 C++のすべての変数と関数にタイプが必要です.
(1)c++中型検出補強
#include
// c++ error:Unknown type name 'f'
// c++ error:Unknown type name 'i'
f(i){
printf("i = d%
",i);
};
(2)c言語におけるint f()は任意のパラメータを受信する関数を表す.
void f_2(){
printf("method f_2()
");
};
int main(void){
f_2(10);
return 0;
}
出力結果
method f_2()
(3)c言語ではint f(void)は無パラメトリック関数を表す
void f_3(void){
printf("method f_3(void)
");
}
int main(void){
// f_3(10); error: Too many arguments to function call, expected 0, have 1
return 0;
}
c++では,int f()とint f(void)は同じ意味を持ち,いずれもintの戻り値を表す無パラメータ関数である.
9三項演算子の機能強化
#include
int main(void){
int a = 10;
int b = 20;
int min_value = 0;
(a < b ? a : b) = 30;
printf("a = %d,b = %d
", a, b);
return 0;
}
出力結果
a = 30,b = 20
原理:C++コンパイラはアドレスを取る操作をしました
*(a < b ? &a : &b) = 30;