C++中的inline函数的实现部分到底该放在哪里

inline的意义在这里就不多说了,主要是实践上需要注意的地方。

关于定义inline函数的位置:

1. 可以在类内定义

class CA
{
public:
   CA(void);
   ~CA(void);
    inline voidShow() {xxx}
};

 

2.※可以在类外定义,但是这里千万注意,不要写在CPP文件中,要写在头文件中,否则产生链接错误(VS2008及以下)。

class CA
{
public:
   CA(void);
   ~CA(void);
    inline voidShow();
};

inline void CA::Show()
{

}

 

结论:确保调用处对函数定义在同一个编译单元,所以要保证inline函数定义在头文件当中。

展开阅读全文

C++中的inline函数实现部分应该放在哪里呢?

02-10

C++中的inline函数的实现部分到底该放在哪里呢?rnrnC++中的类中inline函数的实现部分究竟放在哪里? 下面是两位专家的说法:rn下面引自林锐博士的《高质量C++编程》P67rnrnrn定义在类声明之中的成员函数将自动地成为内联函数,例如rnclass Arnrnpublic:rn void Foo(int x,int y); // 自动地成为内联函数 rnrnrn将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:rn// 头文件:rnclass Arnrnpublic:rn void Foo(int x, int y);rnrnrn// 定义头文件rninline void A::Foo(int x, int y)rnrnrnrnrnrnC++的发明者Bjarne Stroustrup博士在他所著的书《C++语言的设计和演化》中则是这样论述这个问题(见《C++语言的设计和演化》P12):rn在带类的C中只有成员函数能做成在线(注:也就是设计为inline函数)的,而要求函数成为在线只有一种方式,那就是把它的放进类的声明之中。例如:rnclass stackrnrn/* … /*rnchar pop()rnrnIf(top<=min) error(“stack underflow”);rn return *--top;rnrn;rn事实上,那时也看到这会使类的声明显得比较杂乱。另一方面,这看起来也是个好东西,因为它不鼓励在线函数的过度使用。关键字inline和允许在线成员函数的功能都是后来由C++提供的。例如,在C++中可以写下面这样的代码:rnclass stackrnrn/* … /*rnchar pop();rn;rnrnInline char stack:: pop()rnrnIf(top<=min) error(“stack underflow”);rn return *--top;rnrnrn 照两位专家的说法,inline函数的实现代码似乎既可以放在.h文件,也可以放在.cpp文件。实际上是不是这样呢?我使用VC6.0做了一个测试程序(Win32控制台程序):rn程序运行环境:英文版Win Xp sp2rn程序编译环境:VC++ 6.0rn首先我把inline函数的实现代码可以放在.h文件rn测试程序如下:rn// MyString.hrn#ifndef MY_STRING_Hrn#define MY_STRING_Hrnrn#include rnrnclass CMyStringrnrnprivate:rn char *pszData;rnpublic:rn CMyString();rn CMyString(char *psz);rn int GetLength()rn rn return strlen(pszData);rn rn ~CMyString();rn;rnrn#endifrn#endifrnrn// MyString.cpprnrn#include "stdafx.h"rn#include "MyString.h"rn#include rnrnCMyString::CMyString()rnrn pszData = new char[20];rnrnrnCMyString::CMyString(char *psz)rnrn pszData = new char[20];rn strcpy(pszData,psz);rnrnrnCMyString::~CMyString()rnrn delete []pszData;rn pszData = NULL;rnrnrnrn// TestString.cpprnrn#include "stdafx.h"rn#include "MyString.h"rn#include rnrnint main(int argc, char* argv[])rnrn CMyString str("Hello World!");rn int strlen = str.GetLength();rn cout<rnrnclass CMyStringrnrnprivate:rn char *pszData;rnpublic:rn CMyString();rn CMyString(char *psz);rn int GetLength();rn ~CMyString();rn;rnrn#endifrnrn// MyString.cpprnrn#include "stdafx.h"rn#include "MyString.h"rn#include rnrnCMyString::CMyString()rnrn pszData = new char[20];rnrnrnCMyString::CMyString(char *psz)rnrn pszData = new char[20];rn strcpy(pszData,psz);rnrnrninline int CMyString::GetLength()rnrn return strlen(pszData);rnrnrnrnCMyString::~CMyString()rnrn delete []pszData;rn pszData = NULL;rnrnrn// TestString.cpprn#include "stdafx.h"rn#include "MyString.h"rn#include rnrnint main(int argc, char* argv[])rnrn CMyString str("Hello World!");rn int strlen = str.GetLength();rn cout<rnrnclass CMyStringrnrnprivate:rn char *pszData;rnpublic:rn CMyString();rn CMyString(char *psz);rn int GetLength();rn void GetInfo();rn ~CMyString();rn;rnrn#endifrn// MyString.cpprn#include "stdafx.h"rn#include "MyString.h"rn#include rnrnCMyString::CMyString()rnrn pszData = new char[20];rnrnrnCMyString::CMyString(char *psz)rnrn pszData = new char[20];rn strcpy(pszData,psz);rnrnrninline int CMyString::GetLength()rnrn return strlen(pszData);rnrnrnvoid CMyString::GetInfo()rnrn int strlen = GetLength();rn cout<rnrnint main(int argc, char* argv[])rnrn CMyString str("Hello World!");rn int strlen = str.GetLength();rn cout< 论坛

没有更多推荐了,返回首页