精华内容
下载资源
问答
  • 在类中定义成员函数会自动成为内联函数,在类体外定义的不会,若在类体外部定义函数时加入 inline 关键字,会使其成为内联函数。 这种类体外定义inline函数的方式,必须将类的定义和成员函数的定义都放在同一个...

    在C++中,为了解决一些频繁调用的小函数大量消耗栈空间或者栈内存的问题,引入了内联函数。

    在类中定义成员函数会自动成为内联函数,在类体外定义的不会,若在类体外部定义函数时加入 inline 关键字,会使其成为内联函数。

    这种类体外定义inline函数的方式,必须将类的定义和成员函数的定义都放在同一个头文件中(或同一个源文件中),否则编译时无法进行嵌入。

    内联函数一般不是我们所期望的,它会将函数调用处用函数体代替,所以建议在类体内部对成员函数作声明,在类体外部进行定义。

    展开全文
  • 基于其字面提示,错误应该是成员函数应该是没有在类体中声明,而直接在类定义造成的。 由此可能出现下面情况: 在编写类函数实现时出现的1)的情况 1)类内的该成员函数的声明语句或者该成员函数的上一条语句没有...

    基于其字面提示,错误应该是成员函数应该是没有在类体中声明,而直接在类外定义造成的。

    由此可能出现下面情况:

    在编写类函数实现时出现的1)的情况
    1)类内的该成员函数的声明语句或者该成员函数的上一条语句没有加分号导致的。

    	Mat(char* ImageName) //构造函数重载,利用文件名从硬盘加载图像文件成为Mat对象;(没加分号)
    	Mat(T **m, int h, int w); //构造函数重载,从动态数组创建Mat对象;

    template <typename T>
    Mat<T>::Mat(T **m, int h, int w) //构造函数重载,从动态数组创建Mat对象;
    <span style="color:#ff0000;">{                //此处提示:error:应输入声明</span>
    	height=h;
    	width=w;
    	data=new T *[height];
    	for(int i=0;i<height;i++)
    	{
    		data[i]=new T [width];
    	}
    	for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<100;j++)
    		{
    			data[i][j]=m[i][j];
    		}
    	}
    }
    


    2)类定义的结尾(花括号后)没有写分号

    展开全文
  • 问题描述:为了确定作用域的查找过程,在类体外定义了一个函数,当函数为普通函数时,被成员函数调用可以通过编译  得出结论:查找函数声明的过程为,在成员函数实现之前,会先查找类定义,然后查找全局声明,即便...

    问题描述:为了确定作用域的查找过程,在类体外定义了一个函数,当函数为普通函数时,被成员函数调用可以通过编译
                得出结论:查找函数声明的过程为,在成员函数实现之前,会先查找类定义,然后查找全局声明,即便全局声明在类体后声明,也可以被找到

    但运行时则程序报错,将普通函数改为inline函数后,链接错误消失,没搞明白为什么,有知道的大牛可以给解释一下,先谢过了!

    报错信息如下:

    1>Person.obj : error LNK2005: "void __cdecl print(void)" (?print@@YAXXZ) 已经在 classinfo.obj 中定义
    1>C:\Documents and Settings\user\桌面\classinfo\Debug\classinfo.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

    类定义头文件Person.h

    #pragma once
    #include <string>
    #include <iostream>
    using namespace std;
    class Screen;
    
    class Person
    {
    public:
    	explicit Person(void);
    	explicit Person(string s1, string s2):name(s1),address(s2){}
    	~Person(void);
    	string getName() const;
    	string getAddress() const;
    
    	Person& move(int len,int wid);
    	Person& set(string&str1);
    	Person& display(ostream&os);
    
    public:
    	string address;
    private:
    	string name;
    	int length;
    	int width;
    };
    //不加inline会报链接错误
    inline void print(){
    	cout<<endl;
    }


    类实现cpp文件:Person.cpp

    #include "StdAfx.h"
    #include "Person.h"
    #include <iostream>
    
    Person::Person(void)
    {
    	name	= "";
    	address = "";
    	length	= 0;
    	width	= 0;
    }
    
    Person::~Person(void)
    {
    }
    string Person::getName() const
    {
    	cout<<"The getName() return value is "<<name<<endl;
    	print();
    	return name;
    } 
    
    string Person::getAddress() const
    {
    	return address;
    }
    
    Person& Person::move(int len,int wid)
    {
    	length	= len;
    	width	= wid;
    	return *this;
    }
    
    Person& Person::set(string&str1)
    {
    	name = str1;
    	return *this;
    }
    
    Person& Person::display(ostream&os)
    {
    	os << "The name is "	<<name	<<endl;
    	os << "The length is "	<<length<<endl;
    	os << "The width is "	<<width	<<endl;
    	return *this;
    }
    
    
    
    


    main函数classinfo.cpp

     

    #include "Person.h"
    #include <iostream>
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	Person per;
    	string setStr("Jinan");
    	per.move(10,5).set(setStr).display(cout).getName();
    	return 0;
    }


     

     

    展开全文
  • 外联定义成员函数是指在类定义体中声明成员函数,而在类定义体外定义成员函数在类中声明成员函数时,它所带的函数参数可以只指出其类型,而省略参数名;在类外定义成员函数时必须在函数名之前缀上类名,在函数名和...

    类的数据成员说明对象的特征,而成员函数决定对象的操作行为。

    类的成员函数有两种定义方法:外联定义和内联定义。

    (1)外联成员函数(外联函数)

    外联定义成员函数是指在类定义体中声明成员函数,而在类定义体外定义成员函数。在类中声明成员函数时,它所带的函数参数可以只指出其类型,而省略参数名;在类外定义成员函数时必须在函数名之前缀上类名,在函数名和类名之间加上作用域区分符::,作用域区分符::指明一个成员函数或数据成员所在的类。作用域区分符::前若不加类名,则成为全局数据或全局函数(非成员函数)

    在类外定义成员函数的具体形式如下:

    返回值类型 类名::成员函数名(形式参数表)
    {
         //函数体
    }

    如日期类的可以设置三个如下的成员函数:

    void Tdate::set(int m,int d,int y)
    {
        month = m;
        day = d;
        year = y;
    } 
    
    int Tdate::isLeapYear()
    {
        return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
    }
    
    void Tdate::print()
    {
        cout<<month<<"/"<<day<<"/"<<year<<endl;
    }

    (2)内联成员函数(内联函数、内部函数、内置函数)

    程序在编译时将内联成员函数的代码插入在函数的每个调用处,作为函数体的内部扩展,用来避免函数调用机制所带来的开销,提高程序的执行效率。可以将那些仅由少数几条简单语句组成,却在程序中被频繁调用的函数定义为内联成员函数。内联成员函数有两种定义方法,一种方法是在类定义体内定义(隐式声明),另一种方法是使用inline关键字(显式声明)。

    a.在类定义体内定义内联成员函数:

    class Tdate{
    public:
        void Tdate::set(int m,int d,int y)
        {
            month = m;
            day = d;
            year = y;
        } 
        int Tdate::isLeapYear()
        {
            return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
        }
        void Tdate::print()
        {
            cout<<month<<"/"<<day<<"/"<<year<<endl;
        }
    private:
        int month;
        int day;
        int year;
    };

    b.使用关键字inline定义内联成员函数:

    inline void Tdate::set(int m,int d,int y)
    {
        month = m;
        day = d;
        year = y;
    } 

    void inline Tdate::set(int m,int d,int y)
    {
        month = m;
        day = d;
        year = y;
    } 
    
    展开全文
  • 成员函数及重载

    千次阅读 2018-03-17 22:12:39
    成员函数必须在类体内给出...在类外定义成员函数时,函数名应该包括:类名 + 作用域符(::)+ 原函数名在类体内定义的成员函数默认为内联的,而要在类体外定义内联的成员函数,则需在函数返回值前加上关键字inline。...
  • 我们可以用inline来定义内联函数,不过,任何在类的声明部分定义的函数都会被自动的认为是内联函数。  类的成员函数可以分为内联函数和外联函数。...而声明在类体内,定义在类体外成员函数叫外联函数。外联函数的
  • 类体内定义的函数,自动认为是inline的,类体外定义的,必须声明时指定inline,才是inline的。
  • 应该注意的是:如果成员函数不在类体内定义,而在类体外定义,系统并不是把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,则应该加inline关键字,...
  • 函数

    2018-01-15 16:26:49
    private:定义私有成员,只能被类本身的成员函数和友元访问,其他类的成员函数包括...在类体外定义成员函数的格式--- 返回类型 类名::成员函数名(参数说明) { 函数体; } 163 成员访问: 一个对象的成员就是
  • 1 静态数据成员不能用参数初始化表对静态数据成员初始化 (1) 如果声明了类而未定义对象,则类的一般数据成员是不...只要在类中指定了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。 (2)
  • const成员函数

    2016-08-18 09:31:14
    class myclass { public:double fun() const; bool samefun(const myclass &aaa) const {return data = aaa.data;...第一个const 是在fun()后的,这个函数在类体外定义,类外定义时还要记得加con
  • 成员函数与内联函数

    2019-09-21 19:10:41
    11.关于成员函数特征的下列描述中...[解析] 因为成员函数可以在类体内定义,也可以在类体外定义,所以成员函数不一定都是内联函数;成员函数可以重载,可以设置参数的默认值,成员函数可以是静态的。 内联函数是...
  • cp4 上说static需要在类定义体外初始化 但是未初始化时也不报错。
  • 如果在C++类声明了static数据成员和static函数,...可以在类的声明体内定义或者在声明体外定义static函数。在定义时,一定要将关键字"static"去掉,否则会有编译错误(为什么会这样?这个我也没搞明白;也许以后会找到re
  • 1. const成员函数 只是告诉编译器,表明不修改类对象....2. 类体外定义的const成员函数定义和声明处都需要const修饰符 1 class classname  2 {  3 public:  4 classname() {}  5 ~classname();
  • 其特征有:①构造函数是成员函数,可以写在类体外,也可以写在类体内。②函数名与类名相同。③不指定类型说明,无返回值。④实例化对象时系统自动调用。⑤构造函数可以重载。⑥如果在定义类时,没有写构造函数,系统...
  • 成员函数与数据成员 ...外联函数:在类体内声明,在类体外实现 class Date{ private: int y,m,d; public: int getY(){ //内联函数 return y; } //类体内实现 int getM(); //外联函数,声明的时候没有{}
  • 所以我们在类定义体外定义成员函数的时候,必须在函数名之前冠以类名,如Date::isLeapYear()。但如果在类定义体内定义成员函数时,并不需要在成员函数前冠以类名。 //==========================================...
  • C++ - 静态成员函数

    2016-12-28 11:00:00
    1.出现在类体外的函数定义不能指定关键字static;2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;3.非静态成员函数可以任意地访问静态成员函数和静态数据成员;4.静态成员函数不...
  • 近日读C++primer中static一章,有这么一句话,“静态成员函数的声明除了在类体中的函数声明前加上关键字static以及不能声明为const或volatile之外与非静态成员函数相同出现在类体外的函数定义不能指定关键字static”...
  • 静态成员函数总结

    2012-05-14 12:05:21
    1、出现在类体外的函数定义不能指定关键字static; 2、静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数; 3、非静态成员函数可以任意地访问静态成员函数和静态数据成员; 4、...
  •  前一篇文章中说到,内联成员函数的定义有两种方式,一种是在类体内部直接定义,第二种是在类体外定义。下面是代码:  第一种定义方式:   [cpp] view plaincopy class Tes
  • 静态成员变量在公司里的C++程序设计禁止使用全局变量和全局函数,而...c)静态成员变量在类内只是一个声明(无空间),静态成员变量必须在类体外进行定义和初始化。 如:int Cxxxx:nStatic=0;//静态成员变量的初始化;
  • 而说明在类体内,定义在类体外成员函数叫外联函数。外联函数的函数体在类的实现部分。 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在...
  • 2.不同于未初始化的静态全局变量会被赋予默认值,静态成员变量必须手动初始化,并且,由于它存储在内存的静态存储区,故而在C++语法中静态成员变量只能在类体外初始化。此时,前面不需要加关键字static。 3. 静态...
  • 定义成员函数法一:函数体>3行:在类体内声明成员函数,在类体外定义成员函数(最常用) 法二:函数体行:在声明类时在类体内定义//方法一:在类体内声明成员函数,在类体外定义成员函数 class Student {pu

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 183
精华内容 73
关键字:

在类体外定义成员函数