C++中类成员函数未实现,是否能够编译链接通过?

在写代码中经常发现有些类中的成员函数(包括nonvirtual func, virtual func and pure virtual func, static func)并未实现,但仍然能够正常的编译链接通过?

没想太明白,于是做了一下试验。

1)先用纯虚函数做试验

#include "stdafx.h"
#include <iostream>
using namespace std;

class CA
{
public:
    virtual void Display() = 0;
};

int _tmain(int argc, _TCHAR* argv[])
{   
    return 0;
}

编译链接正常


2)用虚函数

class CA
{
public:
    virtual void Display();
}

编译链接正常


3)用一般函数

class CA
{
public:
     void Display();
};

编译链接正常

4)用静态函数

class CA
{
public:
    static void Display();
};

编译链接正常


发现其实定义成任何一种成员函数都没有问题,都能够正常的编译链接通过。

那么什么情况下会出现无法编译链接通过呢?

那很明显应该在类实例化或调用函数时,仍然对上面4种函数进行试验。


1)使用纯虚函数

#include "stdafx.h"
#include <iostream>
using namespace std;

class CA
{
public:
    virtual void Display() = 0;
};

int _tmain(int argc, _TCHAR* argv[])
{   
    CA a;
    return 0;
}

编译失败,报错  error C2259: 'CA' : cannot instantiate abstract class


2)使用虚函数

class CA
{
public:
    virtual void Display();
};

链接失败,报错error LNK2001: unresolved external symbol "public: virtual void __thiscall CA::Display(void)" (?Display@CA@@UAEXXZ)


3)使用一般函数

#include "stdafx.h"
#include <iostream>
using namespace std;

class CA
{
public:
    void Display();
};

int _tmain(int argc, _TCHAR* argv[])
{   
    CA a;
    return 0;
}

编译链接通过,就说明CA对象a可以实例化

很显然,如果调用a.Display(),链接自然会失败


4)使用static函数

#include "stdafx.h"
#include <iostream>
using namespace std;

class CA
{
public:
    static void Display();
};

int _tmain(int argc, _TCHAR* argv[])
{   
    CA a;
    return 0;
}

同一般函数一样,编译链接通过,CA对象可以实例化。

但调用CA::Disply(),链接会失败。


通过以上试验可以对类中定义的成员函数有个一般性的结论了:

1)该类未有任何调用,则不影响任何编译链接

2)当类实例化时,纯虚函数和虚函数无法实例化,原因分别为编译时和链接时报错,这跟vtable相关;一般函数和静态函数可以实例化

3)当类实例化并调用对应的方法时,这个时候肯定必须实现方法了,要不程序怎样调用对应函数指针


以上就是分析的结果。


转:http://m.blog.csdn.net/blog/u012329294/37723881

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++中,类的静态成员函数是属于类本身而不是类对象的成员函数。静态成员函数声明时使用了static关键字。静态成员函数在使用时可以直接通过类名加作用域解析运算符::调用,而不需要通过类对象来调用。 静态成员函数声明实现可以分离,意味着可以将静态成员函数声明和定义放在不同的文件中。这种分离的用途主要有两个方面: 第一,可以将静态成员函数声明放在类的头文件中,将定义放在实现文件中,这样可以提高代码的可读性和可维护性,使得类的接口部分和实现部分分离开来。 第二,当多个源文件需要使用同一个类的静态成员函数时,可以将函数的声明放在一个公共的头文件中,而将函数的定义放在不同的源文件中,然后将这些源文件编译链接在一起。这样可以避免在多个源文件中重复定义静态成员函数,减少了代码的冗余,提高了编译的效率。 需要注意的是,静态成员函数在定义时无法访问类的非静态成员变量和非静态成员函数,因为静态成员函数没有this指针。但是静态成员函数可以访问类的静态成员变量和静态成员函数。 总结起来,类的静态成员函数声明实现分离可以提高代码的可读性、可维护性和代码复用性。它允许将类的接口部分和实现部分分开,并使得多个源文件可以共享同一个类的静态成员函数而不需要重复定义。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值