C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)

在上篇文章《inline的另一用处》中,提到函数实现在类定义中与类定义外的区别。

现在先看个实验:

a.cpp:

[cpp] view plain copy

  1. #ifndef TEST_H
  2. #define TEST_H
  3. class A{
  4. public:
  5. int fun(int x){
  6. return (x*x+1000);
  7. }
  8. };
  9. #endif
  10. void tt()
  11. {
  12. }

b.cpp:

[cpp] view plain copy

  1. class A{
  2. public:
  3. int fun(int x);
  4. };
  5. void tt();
  6. int yy()
  7. {
  8. tt();
  9. A a;
  10. return a.fun(3);
  11. }

将它们分别编译后再链接:

显示链接错误,因为b.cpp(b.o)中找不到A::fun(int)的引用。

将以上的a.cpp改为如下所示:

[cpp] view plain copy

  1. #ifndef TEST_H
  2. #define TEST_H
  3. class A{
  4. public:
  5. int fun(int x);
  6. };
  7. #endif
  8. int A::fun(int x){
  9. return (x*x+1000);
  10. }
  11. void tt()
  12. {
  13. }


    分别编译a.cpp和b.cpp为a.o和b.o后链接,显示链接成功。

这样,第一次链接错误的原因就很明显了。

结论:

在类定义中的类成员函数实现有文件内部作用域,而在类定义外部的类实现有的是全局作用域。

http://blog.csdn.net/tobacco5648/article/details/7651408

时间: 2024-10-12 16:32:32

C++成员函数实现在类定义中与在类定义外的区别(Windows下直接使用g++)的相关文章

C++:成员函数实现在类定义中与在类定义外的区别

//a.cpp class A{ public: int fun(int x){ return (x*x+1000); } }; void tt() { } //b.cpp class A{ public: int fun(int x); }; void tt(); int yy() { tt(); A a; return a.fun(3); } 将它们分别编译后再链接:显示链接错误,因为b.cpp(b.o)中找不到A::fun(int)的引用. 将以上的a.cpp改为如下所示:class A{

oracle中的内连接和外连接区别

表t_user1,t_user2,t_user3,各有id,name两列 id name 1 10A 2 20A id name 1 10B 3 30B id name 1 10C 4 40C 连接分为两种:内连接与外连接. A.内连接 内连接,即最常见的等值连接,例: SELECT *  FROM t_user1,t_user2 WHERE t_user1.id = t_user2.id 结果 id name id name 1 10A 1 10B B.外连接 外连接分为左外连接,右外连接和全

C++:类的成员函数定义方式

1.成员函数的第一种定义方式:在类声明中只给出成员函数的原型,而将成员函数的定义 放在类的外部. 返回值类型 类名::成员函数名(参数表) {      函数体  } class Point{ public: void setpoint(int,int); //设置坐标点的成员函数setpoint的函数原型 int getx(); //取x坐标点的成员函数getx的函数原型 int gety(); //取y坐标点的成员函数gety的函数原型 private: int x,y; }; void P

关于声明、定义、前向声明、include、循环依赖、普通友元函数、友元类、友元成员函数的总结

做<C++ Primer>(第5版)253页练习题7.3.4有感,故总结之 1 声明 1.1 变量和函数的声明 常见的声明是声明一个变量或函数,一般在头文件.h中声明,例如: pos cursor = 0; // 给定初始值 char get(pos r, pos col) const; 1.2 类的声明 对于一个类,一般是直接在头文件中直接写 class ClassName { ... },这称之为类的定义,然后在类体{...}中又声明或定义了成员变量和成员函数.类的声明是没有类体,只有个类

在类的成员函数中调用delete this

在类的成员函数中能不能调用delete this?答案是肯定的,能调用,而且很多老一点的库都有这种代码.假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数.说到这里,相信大家都能明白为什么会这样 了. 根本原因在于delete操作符的功能和类对象的

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int