精华内容
参与话题
问答
  • C++ 静态成员函数

    万次阅读 2020-07-18 20:25:31
    #include <iostream>... //2静态成员函数只能访问静态成员变量 static void func(){ cout << "func调用" << endl; m_A = 100; //m. _B = 100; //错误,不可以访问非静态.
    #include <iostream>
    using namespace std;
    #include <string>
    
    
    
    class Person{
    	public:
    		//静态成员函数特点:
    		//1程序共享一个函数
    		//2静态成员函数只能访问静态成员变量
    		static void func(){
    			cout << "func调用" << endl;
    			m_A = 100;
    			//m. _B = 100; //错误,不可以访问非静态成员变量
    		}
    		static int m_A; //静态成员变量
    		int m_B; //
    	private:
    		//静态成员函数也是有访问权限的
    		static void func2(){
    			cout << "func2调用" << endl;
    		}
    };
    
    int Person :: m_A = 10;
    
    void test01(){
    
    	//静态成员变量两种访问方式
    	//1、通过对象
    	Person p1;
    	p1.func();
    	//2、通过类名
    	Person :: func();
    	//Person::func2(); /私有权限访问本到
    
    }
    
    int main() {
    
    	test01();
    	system("pause");
    	return 0;
    }
    

    展开全文
  • 相当于是熟悉一种语法吧 class Test { public: static void StaticFunc() { printf("StaticFunc \n"); } void NormalFunc() { printf("NormalFunc \n"); } }; int main() { voi...

    相当于是熟悉一种语法吧

    class Test
    {
    public:
        static void StaticFunc()
        {
            printf("StaticFunc \n");
        }
        void NormalFunc()
        {
            printf("NormalFunc \n");
        }
    };
    
    int main()
    {
        void(*pFunc1)();
        pFunc1 = &Test::StaticFunc;
        pFunc1();
    
        void(Test::*pFunc2)();
        pFunc2 = &Test::NormalFunc;
        Test t1;
        (t1.*pFunc2)();
    
        return 0;
    }

    注意:

    静态成员函数函数指针操作同全局函数一样;毕竟静态成员函数不需要绑定到某个对象身上。

     

    展开全文
  • C++ 类成员函数的函数指针

    万次阅读 多人点赞 2018-08-23 18:40:17
    当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针: reference to non-static member function must be called 两个解决方法: 把非静态的成员方法改成静态的...

    一、引言

    当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:

    reference to non-static member function must be called

    两个解决方法:

    1. 把非静态的成员方法改成静态的成员方法
    2. 正确的使用类成员函数指针(在下面介绍)

     

    关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下:

    https://blog.csdn.net/afei__/article/details/80549202

     

    二、语法

    1. 非静态的成员方法函数指针语法(同C语言差不多):

    void (*ptrStaticFun)() = &ClassName::staticFun;

    2. 成员方法函数指针语法:

    void (ClassName::*ptrNonStaticFun)() = &ClassName::nonStaticFun;

    注意调用类中非静态成员函数的时候,使用的是 类名::函数名,而不是 实例名::函数名

     

    三、实例:

    #include <stdio.h>
    #include <iostream>
      
    using namespace std;
      
    class MyClass {
    public:
        static int FunA(int a, int b) {
            cout << "call FunA" << endl;
            return a + b;
        }
      
        void FunB() {
            cout << "call FunB" << endl;
        }
      
        void FunC() {
            cout << "call FunC" << endl;
        }
      
        int pFun1(int (*p)(int, int), int a, int b) {
            return (*p)(a, b);
        }
      
        void pFun2(void (MyClass::*nonstatic)()) {
            (this->*nonstatic)();
        }
    };
      
    int main() {
        MyClass* obj = new MyClass;
        // 静态函数指针的使用
        int (*pFunA)(int, int) = &MyClass::FunA;
        cout << pFunA(1, 2) << endl;
         
        // 成员函数指针的使用
        void (MyClass::*pFunB)() = &MyClass::FunB;
        (obj->*pFunB)();
         
        // 通过 pFun1 只能调用静态方法
        obj->pFun1(&MyClass::FunA, 1, 2);
         
        // 通过 pFun2 就是调用成员方法
        obj->pFun2(&MyClass::FunB);
        obj->pFun2(&MyClass::FunC);
     
        delete obj;
        return 0;
    }

    展开全文
  • 成员函数2. 构造函数2.1 如何定义2.2 如何使用2.3 还有一种写法2.4 示例:创建链表节点3. 与类的区别 1. 成员函数 示例,利用成员函数初始化成员数据: struct Students { // 这是普通成员数据 string name; int ...

    写在前面:大家好K。首先为你点进这篇有趣的文章点赞👍!文章在撰写过程中难免有疏漏和错误,欢迎你在下方留言指出文章的不足之处;如果觉得这篇文章对你有用,也欢迎你点赞和留下你的评论。更多内容请点进👉我的博客K。👈阅览。

    1. 成员函数

    示例,利用成员函数初始化成员数据:

    struct Students {
    	// 这是普通成员数据
    	string name;
    	int age;
    	// 下面定义成员函数,修改成员数据值
    	void set(string name, int year) {
    		// 形参与成员数据同名时,用this->访问成员数据
    		this->name = name;
        	age = year;
      	}
    };
    
    // 某函数中
    Students stu;
    stu.set("jkz", 18); // 调用成员函数
    cout << stu.name << ' ' << endl; // 输出:jkz
    

    利用成员函数初始化数据成员,若形参名与成员数据名相同时,用this关键字,this是指向本身的指针,所以访问成员数据用->

    2. 构造函数

    结构::{}

    示例

    struct Students {
    	string name;
    	int age;
    };
    

    在没有手动初始化值时,两个成员变量默认值为null和0。如果想自定义初始化的值,该如何做呢?

    2.1 如何定义

    struct Students {
    	string name;
    	int age;
    	int grade;
    	Students(string name, int score) : age(18), grade(score) {
    		this->name = name; // 注意用"->"访问成员变量
    	}
    	// 构造函数可以重载(形参列表不同)
    	Students(): name("jkz"), age(18), grade(100) {} // {}不能丢掉
    };
    

    类似于成员函数,但是在初始化成员方面,构造函数显然更方便。

    注意:

    1. 构造函数冒号的左边和构造函数相同,名字与结构体名相同,还有一个形参列表

    2. 如果形参名与成员变量名不同,则可以用成员变量名(形参名)(示例grade变量),多个成员用逗号分割。如果形参名与成员变量名相同,则用{this->成员变量名=形参名;}(示例name变量)来初始化,注意用“->”访问成员变量

    3. 可以直接用变量名(值)(示例name变量)直接给变量赋值

    4. {}一定要有,即使没有用到this来初始化变量,也要加上{}

    5. 形参列表可以为空,然后用第3点的方法初始化变量

    6. 若无构造函数,系统会赠送初始值

    7. this是指向本身的指针,所以访问成员变量用->

    8. 构造函数可以重载

    2.2 如何使用

    // 在某函数中
    // 若构造函数形参列表可以为空
    // 用Students stu;
    Students stu("jkz", 100);
    cout << stu.name << ' ';
    cout << stu.age << ' ';
    cout << stu.grade << endl;
    // 输出
    // jkz 18 100
    

    定义时,结构体变量名后跟是参列表

    像正常访问结构体成员一样访问

    注意:若初始化形参列表为空,那么在定义结构体变量时,不加(),只需要结构体名 变量名

    可以使用new运算符在堆区创建对象(点击学习内存4区

    2.3 还有一种写法

    结构:结构体名(){函数体}

    这种写法,形参列表必须为空,不推荐用

    2.4 示例:创建链表节点

    创建链表节点必须用new运算符来避免内存错误,点击学习悬垂指针

    // 定义结构体
    struct ListNode {
    	int val;
    	ListNode *next;
    	ListNode(int x) : val(x), next(NULL) {}
    };
    
    // 在别的地方使用
    // 创建节点
    // 必须使用new运算符使用堆区空间,以免产生内存错误
    ListNode* h = new ListNode(值域的值)
    
    // 修改值域,连接新节点
    h->next = new ListNode(值域的值)
    
    // 往后移动节点
    h = h->next
    
    // 其他操作……
    

    3. 与类的区别

    C++中的类和java中的类具有较大差别

    1. 结构体关键字struct,类关键字class
    2. 结构体声明通常不包括 public 或 private 的访问修饰符。
    3. C++中类的成员变量,默认是私有的;结构体中的数据成员是公共的,可以被直接访问
    4. 尽管结构体可以包含成员函数,但很少这样做。所以,通常情况下结构体声明只会声明成员变量。(为了读懂别人的代码和老代码,也要学习结构体成员函数)
    展开全文
  • 数据成员: 静态数据成员是类的一...静态函数成员与非静态函数成员都为类所有,对象中并不存在函数的拷贝(每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,但是在逻辑上函数和数据是一起被封装进...
  • 需要求 3 个长方体的体积,请编写一个基于对象的程序
  • 在类外定义成员函数 成员函数可以在类体中直接定义。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如: class Student { public : void display( ); //公用成员函数原型声明 private : int ...
  • 普通成员函数和静态成员函数

    千次阅读 2018-03-25 19:47:25
    类成员包括数据成员和成员函数。 两者区别 1分配内存的时间不同 静态成员属于类本身,不属于具体类对象,在类加载时分配内存空间,程序结束时才消失。可以类名直接访问。 普通成员属于类对象,在类对象创建...
  • C++函数编译原理和成员函数的实现

    千次阅读 2017-07-25 15:34:54
    对象的内存中只保留了成员变量,除此之外没有任何其他信息,程序运行时不知道 stu 的类型为 Student,也不知道它还有四个成员函数 setname()、setage()、setscore()、show(),C++ 究竟是如何通过对象调用成员函数...
  • 成员函数:类型说明符 函数名(参数表) const 如:void showDate() const 1.常成员函数可以访问常数据成员,也可访问普通数据成员。 2.常数据成员可以被常成员函数访问,也可被普通成员函数访问。 3.如果将一个...
  • C++类成员函数指针使用介绍

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

    千次阅读 2019-10-27 17:13:59
    (const对象,不能调用非const成员函数) const 对象,代表该对象对应的成员变量不能被改变, const成员函数,代表该函数不会改变成员变量的值 在const成员函数里,&m_member也会是const类型的指针 ...
  • 函数重载 函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。 注意函数重载中的“形参表”不同,是指本质不同,...
  • C++中,静态成员函数不能被声明为virtual函数。  例如,下面的程序会编译失败。 #include&lt;iostream&gt; class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static ...
  • 成员函数:无论静态函数还是非静态函数,都是属于类的(这一点与数据成员的静态非静态不同),对象并不拥有函数的拷贝.两者的区别在于:非静态的函数由类对象(加.或指针加-&gt;;)调用,这时将向函数传递this指针.而静态...
  • 静态数据成员和静态成员函数

    万次阅读 多人点赞 2018-08-26 19:18:35
    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...
  • 普通成员函数是最一般的方法,即 class Foo: def plain_func(): pass 类成员函数是 class Foo: @classmethod def class_func(): pass 静态函数是 class Foo: @staticmethod def static_func(): pass ...
  • 静态成员函数访问非静态成员

    千次阅读 2019-08-12 21:47:52
    有时候我们必须要使用静态成员函数, 比如把静态成员函数的指针传递到别的模块,以实现回调函数的机制,这个时候若不使用普通函数,则必须使用静态成员函数。 这时候我们有可能需要本类的非静态成员,具体做法很...
  • 题目是:定义Student类和Score类,输出一个学生的成绩单(包括学号、姓名、高数、英语、政治、C++成绩)要求使用Student成员函数作为友元函数 我是这样写的(用的是VS2013): **Student.h** ``` #pragma ...
  • 类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的...
  • C++学习之全局函数和成员函数

    千次阅读 2019-09-16 15:46:48
    1.把全局函数转化成成员函数 通过this指针隐藏左操作数 Test add(Test &t1, Test &t2)===》Test add(Test &t2) 案例:实现 t1 = t1 + t2 class Test { public: Test(int a = 0,...
  • 场景:在使用回调函数时,需要将回调函数设置为静态函数,但是在该回调函数中需要引用非静态成员变量 方法1:声明一个全局变量,比如 llll* g_llll; 在构造函数中,将this指针赋给g_llll; 在静态回调函数中,...
  • 成员函数不能调用非常成员函数:比如:#include&lt;iostream&gt; using namespace std; class A { const void print(){cout&lt;&lt;fun();} }; int fun() { return 2; } int main() { A.a; a....
  • 一般地,class 的权限修饰符是用来...**但是,当我们希望在已知类的构造,并且不希望改变其构造的情况下,能否通过某种方式强制获取类的另一种私有成员——成员函数的指针呢? 如果有,希望前辈能够给予相关指点。**

空空如也

1 2 3 4 5 ... 20
收藏数 110,672
精华内容 44,268
关键字:

成员函数