C++类成员函数定义在类体内为什么不会报重定义错误

C++语言 码拜 8年前 (2016-06-07) 2422次浏览
C++类成员函数定义在类体内为什么不会报重定义错误。类成员函数定义在类体内,并随着类的定义放在头文件中,当被不同的源文件包含,那么每个源文件都应该包含了类成员函数的实体,为何在链接的过程中不会报函数的重定义错误呢?假如是原因是定义在类体内的成员函数被编译器内联处理,但听说并不是全部的成员函数都会被内联处理,例如包含递归的成员函数。
实际测试,不会报重定义错误,为什么会这样,本人哪里理解错误了吗,请指点,谢谢!
解决方案

2

在类内定义的函数是 inline 的(语义上)。
inline 函数必须在每一个用到的地方有定义(而不能只有声明)。

2

嗯,inline函数可以看成代码块,代码块在每个用到的地方copy一份,但不命名,所以不会有冲突

5

inline 和实际内联是两回事
但是 inline 写出了
或直接定义在类内部的被当成inline函数 的成员函数
它 不论有几处定义
–不论头文件包含几次,或类被复制在不同实现文件中几次–
都和 被内联成功一样
假如内联成功,那么就不会有函数定义的代码生成,只会用代码块取代 函数调用。
假如内联失败,那么编译器暗中生成非内联代码,共调用者使用,生成对他的函数调用
编译器暗中实现的那份非内联代码,
最终只会有一份实现,
而不是生成多份,并且都保留下来
–假如采取生成多份策略,那么无论生成几份,最终只保留一份–
原因是这在编译器控制能力范围之内,所以没问题。

用户本人编写的多份非内联实现代码,
不在编译器能力之内。
只有报错,才是本分。

5

写在类内的成员函数在语义上是内联的
假如编译器拒绝内联,也不会报错
而是生成一份独一份的非内联代码。
并把类内定义的内联语义,
当成员函数声明处理。定义也是声明。
inline  函数定义
其作用,与函数声明有点相似
只是,这是个函数定义而已。

5

引用:
Quote: 引用:
Quote: 引用:

在类内定义的函数是 inline 的(语义上)。
inline 函数必须在每一个用到的地方有定义(而不能只有声明)。

莫非定义在类体内的成员函数会全部被内联处理吗?不是有些函数编译器会拒绝内联吗?这个时候会不会报重定义错误呢?

本人的理解是inline函数不管有没有内联,编译器都将消除该函数的外部连接性!

大体上是这种效果

2

头文件通常都会用#ifndef  #define  #endif 防止重复编译

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++类成员函数定义在类体内为什么不会报重定义错误
喜欢 (0)
[1034331897@qq.com]
分享 (0)