c++中定义和声明的区别

本文详细介绍了在编程中变量和函数的声明与定义的区别,包括它们的基本概念、应用场景及注意事项。对于变量而言,定义涉及到内存分配和初始化,而声明仅告知编译器变量的存在及其类型。对于函数,声明提供了函数存在的信息而定义则是函数具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.基本理解

1.定义和声明的简单说明

a.声明就是指给除了当前变量或者函数,或者类什么的名字,不给其中的内容,就是先告诉你有这样一个什么类型的变量或者函数,但是这个变量或者函数的具体信息却是不知道的。就好比跟你介绍一个人的时候,声明就是只告诉你这个人叫什么,但是缺不给你说这个人到底怎么样,他有哪些优点,缺点,喜好问题是什么的。

b.定义就不一样了,定义直接告诉你了所有的东西,这个变量是什么,这个函数是什么功能,这个类里面包含了什么东西。很具体的说明。


2.对于变量来说

a.定义:可以为变量分配存储空间,并且可以给变量一个初始值

b.声明:告诉编译器这个变量的名字和类型(extern int a;(在没有赋值的情况下,变量前加上关键字extern一定为声明))

3.对于函数来说

a.定义:就是这个函数具体的实现

b.声明:告诉编译器在这个程序中会有这么一个函数

简单来说,如果函数带有{},则其为定义;否则,就为声明。


二.深入探讨

1.在一个程序中只能对变量定义一次,因为我们不能让编译器一直为同一个变量,函数分配不同的存储空间;而可以对变量进行很多次的声明。

 2.在任何多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一文件含有变量的定义,则使用该变量的其他文件中就要含有该变量的声明,而不是定义。

3.在头文件中不能放变量的定义,一般存放变量的声明。因为头文件要被其他文件包含,如果放到头文件当中就不能避免变量被多次定义。(const,inline)

三.类的声明

类声明的一般形式:

class类名

{

     private: 私有数据成员; 私有的成员函数;

    protected: 被保护的数据成员; 被保护的成员函数;

    public: 公共的数据成员; 公共的成员函数;

};

其中:class是声明类的关键字,类名是要表明的类的名字,后面的花括号表示出类的声明范围;最后分号表示类声明结束。
类的成员:①私有成员:被该类的成员函数访问
                    ②公有成员可被程序中的其它函数访问,是类的对外接口。
                   ③保护成员在类中等同于私有成员,在继承中等同于公有成员。
           注意:C++规定,在缺省情况下,类中的成员是私有的。
        类的作用域:指在类的声明中的一对花括号所形成的作用域。
说明: 
(1)数据成员可以是任何数据类型,但不能用自动(auto)寄存器(vegister)或外部(extern)  进行说明。
(2)不能在类的声明中给数据成员赋初值。只有在类对象定义后才能给数据成员赋值。

(3)成员函数,又称方法。其定义通常采取两种方式:外部定义,内部定义(①隐式定义:直接将函数定义在类内部; ②显式定义:在类定义体外定义内置函数,在函数定义前冠以"inline")。

参考博客:http://lizhiyuan.bokee.com/907634.html




<think>我们正在讨论C++声明定义区别。根据引用内容,我们可以总结如下: 1. **声明(Declaration)**:告诉编译器某个变量或函数的名称类型,但不分配内存或提供实现细节。 - 对于变量:例如 `extern int x;` 表示声明一个整型变量x,但此时不分配内存。 - 对于函数:例如 `int add(int a, int b);` 表示声明一个函数add,但不提供函数体。 2. **定义(Definition)**:在声明的基础上,为变量分配内存(并可初始化)或为函数提供具体实现。 - 变量定义:例如 `int a = 5;` 这里声明定义了变量a,分配了内存并初始化为5。 - 函数定义:例如 `int add(int a, int b) { return a+b; }` 提供了函数add的具体实现。 3. **重要规则**: - 同一个变量或函数可以被多次声明,但只能被定义一次(One Definition Rule, ODR)。 - 声明通常放在头文件(.hpp或.h)中,定义放在源文件(.cpp)中。 - 使用`extern`关键字进行声明而不定义(用于变量)。 4. **特殊情况(可以在头文件中定义)**: - `const`修饰的对象:因为const对象默认具有内部链接,每个包含该头文件的源文件都有自己的一份副本,不会冲突。 - `inline`函数:内联函数可以在多个源文件中定义(必须完全相同),链接器会选择其中一个。 - 类定义:类的定义通常放在头文件中,但成员函数的实现(定义)通常放在源文件中(也可以在头文件中以内联方式实现)。 5. **全局变量**: - 在单个文件中,全局变量定义在函数体外部。 - 在多个文件中,可以在一个源文件中定义全局变量,然后在其他文件中用`extern`声明(通常将声明放在头文件中)。 6. **头文件的作用**: - 头文件用于放置声明(函数声明、类声明、extern变量声明等),以便在多个源文件中共享声明。 - 使用头文件防卫式声明(`#ifndef`、`#define`、`#endif`)防止重复包含。 下面用代码示例说明: **示例1:变量声明定义** ```cpp // file1.cpp int globalVar = 10; // 定义全局变量globalVar,分配内存并初始化 // file2.cpp extern int globalVar; // 声明globalVar(告诉编译器globalVar在其他地方定义) void foo() { globalVar = 20; // 使用file1.cpp中定义的globalVar } ``` **示例2:函数声明定义** ```cpp // math.h (声明) int add(int a, int b); // 函数声明 // math.cpp (定义) int add(int a, int b) { // 函数定义 return a + b; } ``` **示例3:类声明定义** ```cpp // person.hpp class Person { public: Person(const std::string& name, int age); std::string getName() const; private: std::string name; int age; }; // person.cpp Person::Person(const std::string& name, int age) : name(name), age(age) {} std::string Person::getName() const { return name; } ``` **示例4:特殊情况(头文件中定义)** ```cpp // constants.hpp const double PI = 3.14159; // const常量定义,每个包含该头文件的源文件都有自己的PI副本 inline int max(int a, int b) { // 内联函数定义 return a > b ? a : b; } ``` **总结区别**: | | 声明(Declaration) | 定义(Definition) | |----------|-----------------------------------------|----------------------------------------| | 变量 | `extern int x;`(不分配内存) | `int x;` 或 `int x=5;`(分配内存) | | 函数 | `int add(int a, int b);`(无函数体) | `int add(int a, int b){...}`(有函数体)| | 次数 | 可多次 | 只能一次(ODR) | | 内存分配 | 否 | 是 | 注意:在C++中,变量的定义(如`int a;`)同时也是声明。但声明(使用`extern`)不是定义。 通过以上解释,应该能够清晰理解声明定义区别。在编程中,合理使用声明定义可以避免重复定义错误,并实现代码的模块化。 §§相关问题§§ 1. 为什么同一个变量可以多次声明但只能定义一次? 2. 在头文件中定义变量或函数需要注意什么? 3. `extern`关键字在C++中有什么作用? 4. 如何避免头文件重复包含导致的重复定义错误?</think>### C++声明定义区别C++中,**声明(Declaration)****定义(Definition)**是两个核心概念,它们的主要区别在于是否分配内存或提供具体实现: #### 1. **声明(Declaration)** - **作用**:向编译器介绍标识符(变量/函数/类)的存在及其类型,**不分配内存或提供实现** - **特点**: - 仅提供基本描述(名称类型) - 可多次重复声明(同一作用域内) - 使用关键字`extern`显式声明变量 - **示例**: ```cpp extern int x; // 变量声明(无内存分配) int add(int a, int b); // 函数声明(无函数体) class MyClass; // 类前向声明(不完整类型) ``` #### 2. **定义(Definition)** - **作用**:为标识符**分配存储空间或提供具体实现** - **特点**: - 包含声明功能并扩展实现细节 - 每个实体只能定义一次(ODR规则) - 编译器为其分配内存或生成代码 - **示例**: ```cpp int x = 10; // 变量定义(分配内存+初始化) int add(int a, int b) { // 函数定义(提供实现) return a + b; } class MyClass { // 类定义(完整类型) public: void method(); // 成员函数声明 }; void MyClass::method() { ... } // 成员函数定义 ``` #### 3. **关键区别总结** | 特性 | 声明(Declaration) | 定义(Definition) | |--------------|--------------------------|---------------------------| | **内存分配** | ❌ 不分配内存 | ✅ 分配内存(变量) | | **实现提供** | ❌ 无实现细节 | ✅ 提供实现(函数/类) | | **出现次数** | ✅ 可多次(同一作用域) | ❌ 只能一次(ODR规则) | | **典型形式** | `extern int x;` | `int x = 5;` | | | `void func();` | `void func() { ... }` | #### 4. **实际应用场景** - **头文件(.hpp)**:通常放置**声明**(函数原型、类声明、`extern`变量) ```cpp // mylib.hpp extern int globalVar; // 变量声明 void helper(); // 函数声明 ``` - **源文件(.cpp)**:包含**定义** ```cpp // mylib.cpp int globalVar = 42; // 变量定义 void helper() { ... } // 函数定义 ``` - **特殊允许在头文件中定义的情况**: - `const`常量(各文件独立副本) - `inline`函数(链接时合并相同实现) - 类定义(必须完整可见) #### 5. **常见错误示例** ```cpp // 错误:重复定义 int x; // file1.cpp 中的定义 int x = 10; // file2.cpp 中的重复定义(链接错误) // 正确:声明+单一定义 extern int y; // header.hpp 中的声明 int y = 20; // file.cpp 中的唯一定义 ``` > 核心原则:**声明使标识符可见,定义使其可用**。合理使用声明/定义分离是实现多文件编译避免链接错误的基础[^1][^2][^3][^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值