[C++] C++言語からC言語への機能強化② (変数検出の機能強化 - C++では変数の繰り返し定義が禁止 | structキーワードの機能強化 - structはクラスと同等)





1. 変数検出の強化 - C++ では変数を繰り返し定義できません



初期の C 言語コンパイラ バージョンでは、同じ名前を持つ複数のグローバル変数を繰り返し定義でき、コンパイラはこれらの同じ名前を持つグローバル変数をグローバル データ領域の同じアドレス空間にリンクします。

例: 1 つのヘッダー ファイルで変数が定義されint a;、別のヘッダー ファイルで変数が定義されint a = 1;、 という int 型変数aが 2 回定義されています。

プログラムの実行中に変数 a を呼び出すと、実際にはグローバル データ領域の同じアドレス空間にある変数にアクセスし、int a;2 つの変数のアドレスは同じになります。

次のコードは、初期の C 言語でコンパイルして実行できます。

#include <stdio.h>

int a = 10;
int a = 20;

int main()
{
    
    
	printf("a = %d \n", a);
	return 0;
}

現在のバージョンの C 言語コンパイラでは、変数の繰り返し定義はサポートされていません。gccを使用して上記のコードをコンパイルして実行しようとすると、エラーも報告されます。

C:\Users\octop\Desktop>gcc hello.c
hello.c:4:5: error: redefinition of 'a'
 int a = 20;
     ^
hello.c:3:5: note: previous definition of 'a' was here
 int a = 10;

ここに画像の説明を挿入



C++ 言語では、同じ変数を繰り返し定義することはできません。C ++ コードで変数を繰り返し定義すると、エラーが報告されます。

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Hello.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(4,5): error C2374: “a”: 重定义;多次初始化
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Hello.cpp(3): message : 参见“a”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

ここに画像の説明を挿入





2. struct キーワードの拡張 - struct は class と同等です



C 言語コンパイラは、struct キーワードで定義された構造体を新しい型とはみなしませんが、構造体を変数のセットとして扱います。C 言語では、struct キーワードは通常の構造体型を定義するために使用されます固定サイズのメモリ ブロック エイリアスを定義します。この時点では、その構造にはメモリが割り当てられていません。

  • 構造体型変数が宣言された後、メモリはスタック メモリに割り当てられます。
  • ヒープ メモリにメモリを割り当てるmallocことができます
/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 这是定义了 固定大小内存块别名
 * 此时还没有给 结构体 分配内存
 * 声明了 结构体类型 变量后 , 才会在 栈内存中为其分配内存
 * 使用 malloc 可以在堆内存中为其分配内存
 */
struct Student
{
    
    
    char name[20];
    int age;
    int id;
};

上記の構造体タイプに対応する構造体変数を宣言します。

    // 在栈内存中 定义 Student 结构体 类型变量
    struct Student s1;

を使用してStudent s1;上記の構造体変数を定義すると、C 言語は Student を型とはみなさないため、エラーが報告されます。



C++ では、struct で定義された構造体は新しい型として扱われます。

C++ 言語では、struct キーワードは class キーワードと同じ機能を持ちます。

struct には、public、protected、private のアクセス修飾子のキーワードを追加することもできます。


C++ コードでは、次のコードを使用して構造 Student を定義し、Student s1;型変数を定義するために使用します。次のコードは実行可能です。

コード例:

#include <stdio.h>

struct Student
{
    
    
    char name[20];
    int age;
    int id;
};

int main()
{
    
    
    // 在栈内存中 定义 Student 结构体 类型变量
    Student s1;
    s1.age = 18;
	printf("s1.age = %d \n", s1.age);
	return 0;
}

の結果:

s1.age = 18

Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe (进程 17180)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/han1202012/article/details/132368329