首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++为什么类成员函数不能重新声明,但普通函数可以

C++中类成员函数不能重新声明的原因是因为类成员函数的声明和定义是同时进行的,而普通函数的声明和定义是可以分开的。

在C++中,类成员函数的声明通常在类的头文件中进行,而定义则在类的实现文件中进行。类成员函数的声明包含了函数的名称、参数列表和返回类型等信息,同时也定义了函数在类中的作用域。因此,如果允许类成员函数重新声明,就会导致函数的作用域发生冲突,无法确定具体使用哪个声明的函数。

相反,普通函数的声明和定义是可以分开的。普通函数的声明可以在头文件中进行,而定义可以在实现文件中进行。这样可以方便地在多个源文件中共享同一个函数的声明,而不需要重复定义。因此,普通函数可以在不同的地方进行多次声明,而不会产生冲突。

总结起来,类成员函数不能重新声明是为了保证函数的作用域和定义的一致性,而普通函数可以重新声明是为了方便在多个源文件中共享函数的声明。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++声明成员函数定义 | 引用多个成员对象

C++声明成员函数定义的分离 在C++中,一般做法是将声明放在指定的头文件中,程序员如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写声明,以减少工 作量,提高编程的效率。 ...由于在头文件中包含了声明,因此在程序中就 可以用该类来定义对象,由于在体中包含了对成员函数声明,在程序中就可以调用这些对象的公用成员函数。...在C++中,如果一个声明多次被不同的程序所选用,可以不必每次都对它重复进行编译,而只需编译一次即可,把第一次编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。...C++库包括两个组成部分: 声明头文件 已经过编译的成员函数的定义,它是目标文件。 案例:C++引用多个对象的成员。...以上,如果你看了觉得对你有所帮助,就给小林点个赞叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~ C++声明成员函数定义 | 引用多个成员对象 更多案例可以go公众号:C语言入门到精通

1.8K83

C++】泛型编程 ⑬ ( 模板示例 - 数组模板 | 构造函数和析构函数声明与实现 | 普通成员函数声明与实现 | 外部友元函数声明与实现 )

一、模板示例 - 数组模板 1、需求分析 模板 的 作用就是 令 算法 和 数据类型分离 ; 本篇博客中 开始 使用 模板 开发一个 数组 , 数组 中 可以维护 不同类型的 元素数据 , 如...声明与实现 在声明时 , 前面加上 模板类型声明 template , 说明在中要使用类型 T ; 在 Array 中 , 声明 构造函数 , 拷贝构造函数 , 析构函数..." << endl; } 3、普通成员函数声明与实现 重载 数组下标 [] 操作符 , 使用 模板内部 的 成员函数即可完成 ; 普通成员函数声明 : 数组下标 运算符 重载 , 返回值是一个...template class Array { public: // 数组下标 [] 操作符重载 // 数组元素类型是 T 类型 T& operator[](int i); } 普通成员函数...不能模板 内部定义 , 模板内部定义的 操作符重载函数 , 其 左操作数 必须是 本身 ; 外部友元函数声明 : 声明时 , 需要在 函数名 和 参数列表之间 注明 泛型类型 ;

35910

static关键字总结

可以总结为:static改变了局部变量的存储方式与生命周期,而不改变变量的作用域。 普通函数    这里的普通函数是为了与成员函数区别开来。...需注意的是,const static数据成员的定义体中初始化时,该数据成员仍必须在的定义体之外进行定义(不必再指定初始值了)。...static成员函数不能声明为const。...实际上,成员函数声明为const的本质是它向编译器保证不会通过这个函数来修改对象在内存中的每一个bit的内容(可以看《effective C++》 条款03 “尽可能使用const” ),然而我们知道...另外,虚函数不能声明为static,为什么呢?原因还是static成员函数没有this指针。virtual funtion运行时绑定是多态的基础,没有this指针多态的概念无法践行。

30830

《挑战30天C++入门极限》入门教程:实例详解C++友元

入门教程:实例详解C++友元   在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:   通常对于普通函数来说,要访问的保护成员是不可能的,如果想这么做那么必须把成员都生命成为...public(共用的),然而这做带来的问题遍是任何外部函数可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把成员全部设置成public...友元能够使得普通函数直接访问的保护数据,避免了成员函数的频繁调用,可以节约处理器开销,提高程序的效率,矛盾的是,即使是最大限度的保护,同样也破坏了的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它...,我们成功的访问到了a对象的保护成员name,友元函数不能看做是成员函数,它只是个被声明友元的普通函数,所以在外部函数的定义部分不能够写成void Internet::ShowN(Internet...友的每个成员函数可以访问另一个的所有成员

41920

C++基础(七).多态(1)

函数必须是的非静态成员函数(且非构造函数),其访问权限是public 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基的派生中对虚函数进行重新定义...如果在派生中没有对虚函数重新定义,则它继承其基的虚函数函数可以成员函数操作一般化,用基的指针指向不同的派生的对象时,基成员函数调用基指针,则会调用其真正指向的对象的成员函数,而不是基中定义的成员函数...声明为虚函数的话,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,纯虚函数只是一个接口,是个函数声明而已,它要留到子类里去实现...抽象可以有构造方法,接口中不能有构造方法 抽象可以普通成员变量,接口中没有普通成员变量 接口里边全部方法都必须是abstract的,抽象可以有实现了的方法 抽象中的抽象方法的访问类型可以是...public,protected,接口中的抽象方法只能是public类型的,并且默认即为public abstract类型 抽象可以包含静态方法,接口中不能包含静态方法 抽象和接口中都可以包含静态成员变量

46620

C++程序员经常问的11个问题

指向成员的指针是C++语法中最难以理解的构造之一,但是这也是一个C++最强大的特性。它可以让你调用一个函数成员而不必知道这个函数的名字。这 一个非常敏捷的调用工具。...指向数据成员的指针   尽管刚开始时,指向成员的指针的语法会使你有一点点的迷惑,你不久会发现它其实同普通的指针差不多,只不过是*号的前面多了::符号和的名字,例:定义一个指向int型的指针: int...pmf是一个指向A的函数成员func()的指针.实际上,这个指针和一个普通的指向函数的指针没什么不同,只是它包含了的名字和::符号。...所以,当你通过指针调用一个虚函数成员时,这个调用将会被动态回收。另一个需要注意的地方,你不能取一个的构造函数和析构函数的地址。...要点10、为什么继承一个没有虚析构函数是危险的?    一个没有虚析构函数意味着不能做为一个基

84320

【专业技术】你必须注意的11个C++要点

这样是不是更具有可读性了! 要点6:指向成员的指针 一个有两种基本的成员函数成员和数据成员。同样的,指向成员的指针也有两种:指向函数成员的指针和指向数据成员的指针。...指向成员的指针是C++语法中最难以理解的构造之一,但是这也是一个C++最强大的特性。它可以让你调用一个函数成员而不必知道这个函数的名字。这一个非常敏捷的调用工具。...指向数据成员的指针 尽管刚开始时,指向成员的指针的语法会使你有一点点的迷惑,你不久会发现它其实同普通的指针差不多,只不过是*号的前面多了::符号和的名字,例: 定义一个指向int型的指针: int...A的函数成员func()的指针.实际上,这个指针和一个普通的指向函数的指针没什么不同,只是它包含了的名字和::符号。...要点10、为什么继承一个没有虚析构函数是危险的? 一个没有虚析构函数意味着不能做为一个基。如std::string,std::complex, 和 std::vector 都是这样的。

96650

内联函数 c-浅谈内联函数与宏定义的区别详解

用内联取代宏:   1.内联函数在运行时可调试,而宏定义不可以;   2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;   3.内联函数可以访问成员变量,...宏定义则不能;   4.在声明同时定义的成员函数,自动转化为内联函数。   ...文章(二)   8.5.1 用内联取代宏代码   C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。   在 C程序中,可以用宏代码提高执行效率。宏代码本身不是函数使用起来象函数。...C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作的数据成员。所以在C++ 程序中,应该用内联函数取代所有宏代码,“断言assert”恐怕是唯一的例外。...每个只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。

62240

计算机考研复试C语言常见面试题「建议收藏」

为什么C++默认的析构函数不是虚函数 8 17、函数指针 9 18、fork函数 9 19、构造和析构顺序 9 20、静态函数和虚函数的区别 10 21、静态多态与动态多态 10 22、const修饰普通函数成员函数的目的...) 引用初始化后不能再引用其他对象 8、struct和class的区别(C++) 共同点:struct和class都可以定义成员函数,都具有继承、多态。...class可以声明模板,而struct不可以。 9、c++模板 模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。...为什么C++默认的析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用基指针指向该子类对象,释放基指针时可以释放掉子类的空间,防止内存泄漏。...22、const修饰普通函数成员函数的目的 成员函数指的是class中的函数

1.5K30

《挑战30天C++入门极限》C++面向对象编程入门:(class)

c++中的可以,这一点就和c有了本质的区别,很好的体现了c++面向对象的特点!   ...public声明成公有类型,这一特性同样使用于中的成员函数函数的操作方式和普通函数差别并不大。   ...答案是这样的:在的定义中,一般成员函数的规模一般都比较小,而且一些特殊的语句是不能够使用的,而且一般会被自动的设置成为inline(内联)函数,即使你没有明确的声明为inline,那么为什么有会被自动设置成为...: void test::rp() { ::pp=11; this->pp=100;//this指针就是指向a对象的指针 }   成员函数普通函数一样是可以进行重载操作的...public那么它默认的就是private就是私有的,私有声明可以保护成员不能够被外部访问,但在c++还有一个修饰符,它具有和private相似的性能,它就是protected修饰符。

67110

《逆袭进大厂》第三弹之C++提高篇79问79答

2、虚函数  虚函数是在基中被声明为virtual,并在派生重新定义的成员函数,可实现成员函数的动态重载。 3、抽象  包含纯虚函数称为抽象。...; 3) 定义位置 普通成员变量存储在栈或堆中,而静态成员变量存储在静态全局区; 4) 初始化位置 普通成员变量在中初始化;静态成员变量在外初始化; 5) 默认实参 可以使用静态成员变量作为默认实参...模板函数的实现并不能被编译成二进制代码,结果链接程序找不到地址只好报错了。 《C++编程思想》第15章(第300页)说明了原因:模板定义很特殊。...4) 友元函数,友元函数不属于成员函数不能被继承。对于没有继承特性的函数没有虚函数的说法。 5) 普通函数普通函数不属于成员函数,不具有继承特性,因此普通函数没有虚函数。...当一个成员函数声明为虚函数之后,其派生中同名函数自动成为虚函数,在派生重新定义此函数时要求函数名、返回值类型、参数个数和类型全部与基函数相同。

2.2K30

硬钢百度面试!

定义时要分配空间,不能声明中初始化,必须在定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。...static成员函数:不具有this指针,无法访问对象的非static成员变量和非static成员函数不能声明为const、虚函数和volatile;可以被非static成员函数任意访问 静态局部变量...静态局部变量只初始化一次,并且之后再次调用函数时不再重新分配空间和赋初值,而保留上次函数调用结束时的值(而普通局部变量每调用一次就会重新分配空间并赋一次初值) 静态局部变量默认初始化为0 函数调用结束之后静态局部变量依然存在...考虑的情况 const成员变量:不能定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能声明时初始化。...const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以在const成员函数中被修改)数据的值。

16520

C++:静态成员与友元

静态成员 静态成员包含静态数据成员和静态成员函数,那么为什么会存在静态成员?...它的空间分配有三种可能的情况: 作为的外部接口的头文件 定义的内部实现 程序 main()函数前的全局变量声明与定义处 因为静态数据成员需要实际地分配空间,那么它显然不能声明中定义,因为声明并不存在空间的分配...,所以不能声明中写入以下语句 static int stuNum = 0;//error 它也不能在头文件的声明外部定义,这样会造成在多个使用该类的源文件中会重复定义此静态数据成员。...静态成员函数可以通过对象指针等方法访问对应对象中的非静态成员。...友元的使用 像以上程序片段那样创建友元函数后,就可以通过该函数访问多个中的任何成员了,需要注意的是,虽然友元函数写在了声明中,但它并不是一个成员函数,它仍然只是一个普通函数,只是有访问部分类中任意成员的权限

65310

C++初阶】C++入门

参考链接: C++继续声明 C++入门  C++关键字命名空间C++输入&输出缺省参数和函数重载为什么C语言不能重载(原理) C++关键字  1、asm _asm是一个语句的分隔符。...例如,在1个中,私有变量外部是不能直接访问的。可是假如另外1个函数要访问本类的1个私有变量时,可以把这个函数声明为本类的友元函数或友元。这样他们就可以直接访问本类的私有变量。...,静态局部变量),也可以修饰函数中的成员函数。...29、template 声明一个模板,模板函数,模板等。模板的特化。 30、this 每个成员函数都隐含了一个this指针,用来指向本身。this指针一般可以省略。...为什么C语言不能重载(原理)  C++  C  从上述两张图片的汇编代码中可以看到C语言在编译成汇编代码后 其函数的命名是用函数名来执行的,所以不论怎么重载都不行。

1.2K30

C++基础——函数

默认参数 C++可以函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数 void...虚函数使用原则: 1)当不会用作基时,成员函数不要声明为virtual 2)当成员函数重新定义基的方法,成员函数不要声明为virtual inline内联函数   内联函数由 编译器处理,直接将编译后的函数体插入调用的地方...C++中内联编译的限制: 1.不能存在任何形式的循环语句 2.不能存在过多的条件判断语句 3.函数不能过于庞大 4.不能函数进行取址操作 5.函数内联声明必须在调用语句之前。...调用静态成员函数如下: ::   因为静态成员函数属于整个,在实例化对象之前就已经分配空间了,而的非静态成员必须在实例化对象后才有内存空间,所以静态成员函数中,不能使用普通变量和成员函数...它是定义在外的普通函数,它不属于任何需要在的定义中加以声明声明时只需在友元的名称前加上关键字friend。   需要注意的是友元函数不是成员函数,却可以访问中的私有成员

59540

C++必知必会之基础知识-常用关键字(1)

修饰变量说明该变量不可以被改变 修饰指针分为指向常量的指针和指针常量 修饰引用常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改 修饰成员函数说明该成员函数不能修改成员变量 // class...修饰成员函数修饰成员函数使得不需要生成对象就可以访问该函数,但是在 static 函数不能访问非静态成员。...在函数内部使用static关键字声明的变量是静态变量,它在程序的生命周期内保持其值,不会在每次函数调用时重新初始化。静态变量存储在静态数据区,而不是栈上。...+中,使用static关键字在声明成员函数被称为静态函数,也称为的静态成员函数。...以下是内联函数的一些特点和注意事项: 定义:内联函数通常在定义中声明,也可以函数定义时加上inline关键字。

17040

当我们使用虚函数的时候,我们究竟想干什么?

学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想。...她的语法说来也不复杂,概括起来就这么几条: 在成员方法的声明(不是定义)语句前面加个单词:virtual,她就会摇身一变成为虚函数。...在虚函数声明语句末尾中加个 =0 ,她就会摇身一变成为纯虚函数。 子类可以重新定义基的虚函数,我们把这个行为称之为复写(override)。...第一,当基的某个成员方法,在大多数情形下都应该由子类提供个性化实现,可以提供一个备选方案的时候,请将其设计为虚函数。...第五,虚函数普通函数实际上是存储在不同的区域的,虚函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的虚函数时就将原来基的版本给覆盖了,另一侧面也说明了为什么声明的虚函数在后代中不需要另加声明一律自动为虚函数

42520

一口气搞懂《虚函数和纯虚函数

学习C++的多态性,你必然听过虚函数的概念,你必然知道有关她的种种语法,你未必了解她为什么要那样做,未必了解她种种行为背后的所思所想。...她的语法说来也不复杂,概括起来就这么几条: 在成员方法的声明(不是定义)语句前面加个单词:virtual,她就会摇身一变成为虚函数。...在虚函数声明语句末尾中加个 =0 ,她就会摇身一变成为纯虚函数。 子类可以重新定义基的虚函数,我们把这个行为称之为复写(override)。...第一,当基的某个成员方法,在大多数情形下都应该由子类提供个性化实现,可以提供一个备选方案的时候,请将其设计为虚函数。...第五,虚函数普通函数实际上是存储在不同的区域的,虚函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的虚函数时就将原来基的版本给覆盖了,另一侧面也说明了为什么声明的虚函数在后代中不需要另加声明一律自动为虚函数

71220
领券