精华内容
下载资源
问答
  • 2017-12-25 19:41:31
    #ifndef _CLASS_H_
    #define _CLASS_H_
    
    class CanExtTxPDO_t
    {
    private:
    	unsigned char i;
    public:
        
    	unsigned char buffer[10];
    
    	CanExtTxPDO_t(unsigned char arg0, unsigned char arg1);
    	~CanExtTxPDO_t(void);
    
    	static void ClassFunc0(unsigned char arg0, unsigned char arg1);
    	static void ClassFunc1(unsigned char arg0, unsigned char arg1);
    	static void ClassFunc2(unsigned char arg0, unsigned char arg1);
    };
    
    #endif

    // Class.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "class.h"
    #include <iostream>
    
    CanExtTxPDO_t::CanExtTxPDO_t(unsigned char arg0, unsigned char arg1)
    {	
    
    }
    
    CanExtTxPDO_t::~CanExtTxPDO_t(void)
    {
    
    }
    
    void CanExtTxPDO_t::ClassFunc0(unsigned char arg0, unsigned char arg1)
    {	
    	using namespace std;
    	cout <<"This is Class Function 0!" << endl;
    }
    
    void CanExtTxPDO_t::ClassFunc1(unsigned char arg0, unsigned char arg1)
    {	
    	using namespace std;
    	cout <<"This is Class Function 1!" << endl;
    }
    
    void CanExtTxPDO_t::ClassFunc2(unsigned char arg0, unsigned char arg1)
    {
    	using namespace std;
    	cout <<"This is Class Function 2!" << endl;
    }
    
    int main(int argc, _TCHAR* argv[])
    {
    	using namespace std;
    	char ch;
    	
    	CanExtTxPDO_t::ClassFunc0(0, 0);
    	CanExtTxPDO_t::ClassFunc1(0, 0);
    	CanExtTxPDO_t::ClassFunc2(0, 0);
    
    	cout <<"hello world!" << endl;
    
    	system("pause");
    	return 0;
    }
    


    输出结果:
    This is Class Function 0!
    This is Class Function 1!
    This is Class Function 2!
    hello world!

    更多相关内容
  • C++ 类成员函数调用

    千次阅读 2019-04-21 22:39:49
    今天看了一篇写得很好的博客:类成员函数调用分析 看完后,有一些小的心得,大概是帮我理了一遍吧。 全局变量和static变量存放在静态存储区。 与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态...

    今天看了一篇写得很好的博客:类成员函数调用分析

    看完后,有一些小的心得,大概是帮我理了一遍吧。

     

                                                                            全局变量和static变量存放在静态存储区。

    与静态成员变量和非静态成员变量不同的是:静态成员函数和非静态成员函数存放在代码区,这两种函数调用时把当前类对象的地址通过隐式传递给函数,非静态成员函数内部有一个this指针,this指针会被调用的类对象地址赋值,因此非静态成员函数能准确得访问类对象的成员变量。而静态成员函数没有this指针,同样可以对函数进行调用,调用方式同全局函数调用,他只能访问静态成员变量(没有this指针嘛)。这里有一个小知识,this指针,是常指针,这就保证了this指针只能改变其指向的对象的内容,并不能改变其指向,达到了访问数据的安全性。由此可见,类的函数参数表隐含有一个this指针,当要调用函数之时,参数表中的局部变量在栈区申请空间,当函数结束时释放。所以,类没有this指针,类的实例(对象)也没有this指针,this指针是函数中的局部变量。

    虚成员函数的调用与上面两种函数不一样,它是在类中存放了一个虚函数指针vptr,vptr存放的是虚函数表vtable的首地址,虚函数表中存放的地址是一个相对地址(这里也不知道对不对,是相对地址吗),真正的地址需要用首地址加上偏移量得到。基类对象内部的虚函数表指针指向基类的虚函数表,派生类对象的虚函数表指针指向派生类的虚函数表。

    sizeof访问的是数据段的内存大小,(这里数据段指的是什么?)

    今天先写到这里,感觉还是有点乱的,应该还有点误区。

    .text(文本段也叫代码段(区)),包含可执行指令、函数代码,用二进制方式存储。对于经常执行的程序,只有一个副本需要存储在内存中,代码段是只读的,以防止程序以外修改指令。

    其他段:1.只读数据段:文字常量、const全局变量 2.符号段。

    .data(初始化的数据段,通常称为数据段(区))包含初始化的全局变量和静态变量

    .bss(未初始化的数据段)包含所有初始化为0和没有显示初始化的全局变量和静态变量

    全局变量和静态变量的存储区域是在一起的,存放在静态存储区,所以静态存储区应该在上面两大数据段区。

    展开全文
  • C调用C++类成员函数--实例

    千次阅读 多人点赞 2022-04-29 17:54:55
    在C和C++混合编程中,常见的是C++调用C,这种是比较简单的,一个extern “C”{}即可解决问题。而C调用C++则是使用相对较少的,我们通过一个例子来说明C如何调用C++成员函数。 首先我们实现一个简单的C++程序,作为...

    目录

    1. 问题成因

    2. 反汇编证明

    3.C++程序

    3.1 add.h

    3.2 add.cpp

    4. 中间封装程序

    4.1 myadd.h

    4.2 myadd.cpp

    5. C主程序 main.c

    6. 编译执行


    1. 问题成因

    C与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号库中的名字包含了函数名、函数参数类型和函数返回类型等。因此,当两者混合编译时,会相互找不到对象。

    2. 反汇编证明

    我们通过反汇编来证明上述问题,请看下面的例子:

    #include "stdio.h"
      
    int funP(int a)
    {
        return 0;
    }
    
    int main()
    {
        int a = 0,ret;
        ret = funP(a);
        return 0;
    }

    对这一段小程序test.c,我们分别使用gcc和g++两种工具进行编译:

    gcc test.c -o testc
    g++ test.c -o test+

    对可执行程序进行反汇编

    7cfc0c757e5d4677b2b07ee19d54df73.png

     可以看到gcc编译的testc反汇编出来函数名为就是funP,而g++编译的test+反汇编出来函数名为_Z4funPi,带上了返回类型和函数参数类型。两者的不一致导致C与C++相互调用无法找到对应函数。

    在C和C++混合编程中,常见的是C++调用C,这种是比较简单的,一个extern “C”{}即可解决问题。而C调用C++则是使用相对较少的,我们通过一个实例来说明C如何调用C++类成员函数。

    3.C++程序

    3.1 add.h

    #ifndef ADD_H
    #define ADD_H
    
    class addCode
    {
    public:
    	addCode();
    	~addCode();
    
    	void setNum(int a);		
    	int getNum();
    private:
    	int m_a;	
    };
    
    #endif

    3.2 add.cpp

    #include <stdio.h>
    #include "add.h"
    
    addCode::addCode()
    {
    	m_a = 0;
    }
    
    addCode::~addCode()
    {
    }
    
    void addCode::setNum(int a)
    {
    	a++;
    	printf("c++ a = %d\n",a);
    	m_a = a;
    }
    
    int addCode::getNum()
    {
    	return m_a;
    }

    4. 中间封装程序

    通过中间封装程序,实现C与C++之间的转换,中间封装头文件提供给C和C++程序来调用。

    4.1 myadd.h

    extern “C”{ } 告诉C++编译器以C的规则来链接函数,以便C编译器之后在对象文件中找到正确的符号。#ifdef _ucplusplus 是因为C编译器不知道关键字extern。

    #ifndef MYADD_H
    #define MYADD_H
    
    #ifdef __cplusplus
    extern "C"{
    #endif
    
    typedef struct addCode addCode;
    addCode* newAddCode();
    void interSetNum(addCode *v,int a);
    int interGetNum(addCode *v);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

    4.2 myadd.cpp

    #include "add.h"
    #include "myadd.h"
    
    extern "C"{
    	addCode* newAddCode(){
    		return new addCode();
    	}
    
    	void interSetNum(addCode *v,int a)
    	{
    		v->setNum(a);
    	}
    
    	int interGetNum(addCode *v)
    	{
    		return v->getNum();
    	}
    }

    5. C主程序 main.c

    #include <stdio.h>
    #include "myadd.h"
    
    int main(void)
    {
    	int a = 1;
    
    	struct addCode* v = newAddCode();
        //传递参数给C++
    	interSetNum(v,a);
    	printf("main a = %d\n",a);
    
        //获取C++中参数值
    	a = interGetNum(v);
    	printf("main get a = %d\n",a);
    
    	return 0;
    }

    6. 编译执行

    为了体验过程,我们不再编写makefile,依次使用如下命令行进行编译:

    g++ -c add.cpp -o add.o
    g++ -c myadd.cpp -o myadd.o
    gcc -c main.c -o main.o
    g++ add.o myadd.o main.o -o test

    编译完成,执行程序,结果如下:

    4a38a2d3ffdd41b7a4ab6022cb318b12.png

    通过上述例子,我们实现了C对C++的调用,大家可以参考。

    展开全文
  • c++ 多线程调用类成员函数方法

    千次阅读 2021-04-29 16:31:27
    main.cpp #include <iostream> #include <thread> using namespace std; class print { public:... // 传入顺序 线程函数,实例化指针,函数参数 thread t1(&print::printHello,&pt,"dabin"); t1.join(); return 0; }

    main.cpp

    
    #include <iostream>
    #include <thread>
    
    using namespace std;
    
    class print
    {
    public:
        void printHello(string name)
        {
            cout<<"Hello "<<name<<"!!!\n";
        }
    };
    
    
    int main(int argc, char **argv) 
    {
        print pt;
        //  传入顺序 线程函数,实例化类指针,函数参数
        thread t1(&print::printHello,&pt,"dabin");
        t1.join();
        
        return 0;
    }
    
    
    
    展开全文
  • C++类static成员函数调用

    千次阅读 2021-10-13 18:08:31
    class中的静态成员函数作用再整个的内部,对应的所有实例是共享静态成员函数的,在调用静态成员函数的时候跟调用非静态成员函数是有区别的。另外,静态成员函数只能访问对应内部的静态数据成员,否则会出现...
  • 先写一个日期,把构造函数,拷贝构造函数,析构函数,赋值运算符的重载都写上,代码如下:class Date{ public: //构造函数 Date() { cout &lt;&lt; "Date()" &lt;&lt; endl; } //...
  • C++: 外部函数调用类成员函数的方式

    千次阅读 2019-02-26 10:11:23
    普通函数(入参一定)调用类成员函数 pthread_create的钩子函数,void ()(void * data)-&gt; void 可传入this指针 ,进而调用类成员函数 signal的钩子函数,void (*)(int signal)-&gt; 通过参数...
  • C++类成员函数指针使用介绍

    万次阅读 多人点赞 2019-09-21 16:07:49
    在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member ...
  • C++类成员函数

    千次阅读 2021-06-08 10:00:48
    1.1 C++类成员函数的性质 类的成员函数是函数的一种,它的用法和作用和一般函数基本上是一样的,它也有返回值和函数类型。它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private...
  • c++成员函数调用过程

    千次阅读 2018-10-15 16:51:34
    成员函数调用过程 假如我们调用p-&gt;mem():   1.首先确定p的静态类型。 2.在p的静态类型中查找mem()。如果找不到,则依次在直接基类中不断查找直到继承链的顶端。 3.一旦找到了mem...
  • 在继承之外,在C++中一个类成员函数调用另一个类成员的方法主要有:类的组合,友元类,类的前向声明,单例模式等,下面主要讲讲这4种方法的实现 方法1:利用类的组合 组合通俗来讲就是类B有类A的属性,如声明一个...
  • C++ Thread使用类成员函数

    千次阅读 2021-03-25 12:08:19
    C++ Thread使用类成员函数示例代码编译运行结果 示例代码 #include <thread> #include <iostream> using std::cout; using std::endl; using std::thread; class Job { public: Job(int m) : _m(m){}...
  • 为了验证C++类函数的相互调用,利用VC6.0的对话框和任意一个逻辑,实现了点击对话框按钮-〉调用逻辑类函数-〉在对话框显示运行结果的功能
  • 通过函数指针调用一个函数的时候,此函数必须有具体的地址,因此当调用一个类成员函数的时候,此成员函数必须声明为static,即静态成员函数,这样就能通过函数指针获取到成员函数的地址,进而调用
  • 本文主要介绍C++回调函数中调用类中的非静态成员变量或非静态成员函数 回调函数中调用类中的非静态成员变量或非静态成员函数 【问题】如何在类中封装回调函数? a.回调函数只能是全局的或是静态的。 b.全局函数会...
  • C++ 成员函数

    千次阅读 2020-04-07 17:10:42
    C++ 成员函数一、普通成员函数二、构造函数三、析构函数四、拷贝构造函数 一、普通成员函数 1、普通成员函数的声明 普通成员函数必须在中声明,声明方式与声明普通成员函数的方式一样 class People { public...
  • c++类的方法和成员调用方式

    千次阅读 2015-11-05 14:33:27
    //调用实例注意:Fbnc::Fibonacci()这样的调用方法只有在有方法覆盖或重写时才能调用;或者将该方法设为静态方法;经常作为界面按钮的回调函数使用。or ①、 Solution *Fbnc= new Solution ();//来创建一个的...
  • 要求入口函数必须是的静态函数。 通常,可以采用thunk,或者模板来实现。 因C++ 11中引入了 std::async ,可以很好的解决这个问题了。 值得注意的是,在循环中 std::async 创建线程,我试了好多次总是失败,...
  • C++指向类成员函数的指针详细解析

    千次阅读 2019-02-14 14:10:59
    类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数。前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和...
  • C++---空指针能调用类成员函数吗?

    千次阅读 多人点赞 2019-05-02 12:00:52
    我们知道,一个对象的指针可以调用它的成员函数和虚函数,那么如果一个指向空nullptr的指针,能不能调用它的成员函数和虚函数。 #include<iostream> using namespace std;; class A { public: void func1() ...
  • C++ 类成员函数的函数指针

    万次阅读 多人点赞 2018-08-23 18:40:17
    一、引言 当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用... 正确的使用类成员函数指针(在下面介绍)   关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下...
  • 1. 通过中的public成员函数调用private成员函数: #include<iostream> using namespace std; class Test { public: void fun2() { fun1(); } private: void fun1() { cout<<...
  • c++调用静态函数的方法

    千次阅读 2020-08-09 13:09:25
    今天在写c++程序时,发新现在的gcc和vc++对于静态函数的调用方式有所改变,在旧标准的c++中,调用类的静态方法只能用类名::函数名的方式,在新的标准中,类的对像也可以像调用类的方法一样调用静太函数。示例如下: ...
  • C++类成员函数返回对象及返回引用

    千次阅读 2021-11-22 15:54:40
    C++类函数返回的对象及的引用一、代码例题二、返回引用三、返回对象 一、代码例题 #include <iostream> using namespace std; class machine; ostream& operator<<(ostream& o,const ...
  • 声明:引用两处博客 http://blog.csdn.net/lg1259156776/ ... ...C调用C++,使用extern “C”则是告诉编译器依照C的方式来编译封装接口,当然接口函数里面的C++语法还是按C++方式编译。 使用extern
  • 关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,...这个程序实现了脚本调用C++类成员函数方法
  • c++类成员函数调用

    千次阅读 2015-05-28 16:08:15
    我知道C++有一个虚函数列表,对象有指向虚函数列表的指针,对于有虚函数对象调用函数时通过虚函数列表里面的指针实现的。。但是对于普通的非虚函数是怎么实现调用的呢、? 是怎么找到非虚函数的入口地址? ...
  • c语言调用c++类成员函数的方法

    千次阅读 2015-10-16 18:03:42
    c语言调用c++成员函数的方法
  • cout调用带参成员函数指针指向setSpeed(double)"; (pt->*ps)(88.88); cout调用带参成员函数指针指向setWeight(double)"; (pt->*pw)(99.99); cout调用无参成员函数指针指向Move()"; (pt->*pm)(); } 企业网站/微信小...
  • 应用c++11实现c++线程回调函数调用类成员函数方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,679
精华内容 123,471
关键字:

c++调用类成员函数

c++ 订阅