网站开发是哪个济南网站制作工具
2026/5/23 23:30:51 网站建设 项目流程
网站开发是哪个,济南网站制作工具,台州网站关键字优化,如何备份wordpress主题一个声明就是一个定义#xff0c;除非 #xff1a; 它声明了一个没有具体说明函数体的函数#xff1b; 它包含一个extern说明符#xff0c;并且没有初始化程序或函数体#xff1b; 它是一个类定义内的静态类数据成员的声明#xff1b; 它是一个类名的声明#xff1b; 它…一个声明就是一个定义除非 ·它声明了一个没有具体说明函数体的函数·它包含一个extern说明符并且没有初始化程序或函数体·它是一个类定义内的静态类数据成员的声明·它是一个类名的声明·它是一个typedef声明。一个定义就是一个声明除非·它定义了一个静态类数据成员·它定义了一个non-inline成员函数。声明告诉编译器「这个名字存在它的类型是什么」仅引入名称到作用域不分配存储空间、不提供具体实现。定义不仅声明名称还为其分配存储空间变量或提供具体实现函数/类是编译器生成代码、分配内存的依据。这段话的核心是声明和定义高度重叠但有特定例外—— 先默认「声明定义」再列例外再默认「定义声明」再列例外。下面逐句拆解结合例子理解。一、「一个声明就是一个定义除非以下5种情况」这句话的意思是绝大多数声明会同时完成定义只有这5种情况声明仅仅是「声明」不会成为「定义」。例外1声明了没有具体说明函数体的函数解释函数声明只告诉编译器「有这个函数」但没给出函数的具体实现函数体因此只是声明不是定义。例子voidf();// 仅声明告诉编译器有个返回void、无参数的函数f但没说f做什么voidf(){// 声明定义既告诉编译器有f又给出函数体实现std::couthello;}例外2包含extern说明符且无初始化程序变量/无函数体函数解释extern关键字的核心含义是「这个名字的定义在别处」因此带extern且无初始化/函数体的声明仅起「告知存在」的作用不分配内存/不提供实现。注意如果extern变量带初始化或extern函数带函数体就变成了定义例子externinta;// 仅声明a的定义在其他文件/本文件后续位置externinta10;// 声明定义虽然有extern但初始化了分配内存并赋值externvoidf();// 仅声明f的定义在别处externvoidf(){}// 声明定义有函数体是定义例外3类定义内的静态类数据成员的声明解释静态类数据成员属于「类级别的资源」而非对象级类内仅能声明不能分配内存定义必须在类外单独定义C17前。例子classA{staticintx;// 仅声明告诉编译器A有个静态成员x但不分配内存};intA::x0;// 定义为x分配内存并初始化这才是真正的定义C17后可加inline让类内定义生效static inline int x 0;此时类内既是声明也是定义例外4类名的声明前向声明解释仅告知编译器「有这个类/结构体存在」但未定义其成员大小、方法、数据因此只是声明不是定义。例子classB;// 仅声明前向声明编译器知道B是类但不知道B有什么structC;// 同理结构体前向声明也是仅声明classB{// 声明定义定义了B的成员编译器能确定B的大小和布局inty;voidg();};例外5typedef声明解释typedef只是给已有类型起「别名」没有定义新类型也不分配内存因此仅为声明。例子typedefintInt;// 仅声明Int是int的别名无内存分配无新类型定义usingIntint;// C11的类型别名和typedef等价也是仅声明二、「一个定义就是一个声明除非以下2种情况」这句话的核心是绝大多数定义本身也是声明因为定义必然先告知编译器「这个名字存在、类型是什么」但这2种情况中「定义」是「对已有声明的补充」而非「新的声明」—— 即定义本身不承担「首次声明」的角色。例外1定义了静态类数据成员解释静态类数据成员的「首次声明」已经在类内完成类外的定义只是「为已有声明分配内存/初始化」因此这个「定义」不再是「新的声明」。例子classA{staticintx;// 首次声明这是声明不是定义};intA::x0;// 定义补充实现分配内存但不是新的声明声明已在类内完成这里的int A::x 0是定义但它不是「声明」因为声明已经在类内做了因此违反「定义就是声明」的默认规则。例外2定义了non-inline成员函数解释类内的成员函数声明是「首次声明」类外的non-inline成员函数定义只是「为已有声明提供实现」因此这个定义不再是「新的声明」。注意inline成员函数若在类内定义既是声明也是定义符合「定义就是声明」类外inline定义同理。例子classA{voidf();// 首次声明声明了成员函数finlinevoidg(){}// 类内inline定义既是声明也是定义符合默认规则};voidA::f(){}// non-inline定义仅提供实现不是新的声明声明已在类内完成inlinevoidA::g(){}// 类外inline定义仍是声明定义符合默认规则这里的void A::f() { }是定义但不是「新的声明」因此属于例外。三、总结核心逻辑与易错点默认规则声明 → 大概率是定义除非5种例外定义 → 大概率是声明除非2种例外。关键区分「声明」解决「名字存在吗类型是什么」「定义」解决「内存在哪里实现是什么」。易错点extern变量带初始化 定义而非仅声明类内静态成员 仅声明类外才是定义C17前前向声明class B; 仅声明无法用于创建对象/调用成员因为编译器不知道布局non-inline成员函数的类外定义只是实现不是新声明。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询