美文网首页
C++总结之静态成员与友元函数

C++总结之静态成员与友元函数

作者: bluewind1230 | 来源:发表于2018-01-30 09:08 被阅读0次

    为什么要有静态成员?
    全局变量可以实现数据共享,但是处处不可见,不安全---->静态成员可以实现一个类的所有对象的数据共享。

    static特点:
    • 声明在类内;但是初始化赋值必须在类外(静态成员函数的实现在类内外皆可以),并且不需要加static,但是必须指明为哪一个类的;
    • 静态成员不占用类对象内存;
    • 静态成员为所有对象所共有,不单独属于某一个类对象
    • 静态成员函数可以访问私有成员
    其他几个总结(包含c语言):
    • static修饰局部变量,生存周期为函数运行期间,作用域为本函数内
    • static修饰全局变量或者函数,表示它所修饰的内容对其他文件不可见
    • 当它修饰一个类的成员变量时,表示它所修饰的这个变量为这个类的所有对象所共有;
    • 静态成员函数只能操作静态数据;
    • 非静态成员函数既可以操作静态也可以操作非静态数据
    友元函数

    作用:授予某个对象访问本类所有成员的权限
    某个对象指:
    1.普通函数(友元函数)
    2.另一个类中成员函数(友元成员函数)
    3.另一个类(友元类)
    通常格式为:
    friend 被授予权限的函数原型;
    friend int main ();
    friend void :A:fun();
    friend class A(所有成员函数皆为友元函数)

    没有this指针的情况

    this指针见这里https://www.jianshu.com/p/07b3e236054d;

    • 当使用static修饰一个类的成员函数时候,此函数不会传入一个隐含的this指针;
    • 使用友元函数重载,将不存在隐含的this指针,需要在参数列表里面给出所有操作数.
    静态成员函数一个例子
    // staticTest.h文件
    #pragma once                   
    class staticTest
    {
    public:
        staticTest();
        ~staticTest();
        static int a;
        
    };
    
    
    // staticTest.cpp文件
    #include "stdafx.h"
    #include "staticTest.h"
    
    
    staticTest::staticTest()
    {
    }
    staticTest::~staticTest()
    {
    }
    static void f() {
        printf("static函数测试1");
    }
    
    
    void f1() {
    f();      //此处可以调用f函数,没有报错,因为f1与f在同一个cpp文件里面
    }
    
    
    //main.cpp文件
    
    // static测试.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include "staticTest.h"
    
    int main()
    {
          f();               //此处会报错,未定义标识符f,因为在.cpp文件里面用static修饰全局//变量或者函数,其他文件不可调用
        getchar();
        return 0;
    }
    
    
    
    

    一个变量或者说一个函数在声明时把给它添加了一个关键字static, 对于全局变量, 这个全局变量就不能被其它文件使用; 对于局部变量,则使得它的生存周期变得和全局变量一样长, 但作用域保持不变,
    这里的文件指的是:那些包含有可执行代码的文件,不仅仅限于.h或是.cpp, 有函数定义的文件都是; 使用者最终被落实在一条语句中, 语句只能在函数内部出现,要想实现static的这种功能,不要把static修饰的变量或者函数写在头文件里面,直接定义在对应的.cpp文件里头即可,因为一般要把头文件包含了,所以static这个特殊功能可能实现不了. (用static修饰函数或全局变量的时候, 这些函数或全局变量就不要放在头文件了,只要写在相应.cpp文件中),具体参见上面这个例子;

    相关文章

      网友评论

          本文标题:C++总结之静态成员与友元函数

          本文链接:https://www.haomeiwen.com/subject/qcsqzxtx.html