zoukankan      html  css  js  c++  java
  • C++中级-(静态成员和对象丶this指针丶常函数和对象、成员函数和对象)

    类对象作为类成员

    #include <iostream>
    #include <string>
    using namespace std;
    
    //c++类中的成员可以是另一个类的对象,称为对象成员。
    class A {
    public:
        A() { cout << "A side 
    "; };
        ~A() { cout << "Release A 
    "; };
    
    };
    
    class B {
    
    public:
        A a;//使用A作为对象成员
        B() { cout << "B side 
    "; };
        ~B() { cout << "Release B 
    "; };
    };
    //
    
    
    int main() {
        B b;
        return 0;
    }

    静态成员变量

    #include <iostream>
    #include <string>
    using namespace std;
    //C++中使用静态成员变量来实现多个对象共享数据的目标,是一种特殊的成员变量。
    
    
    class Person {
    public:
        Person(string name, int age, int score) {};
        static int cont;//独立占一份内存
    private:
        string name;
        int age;
        int score;
    };
    //成员变量必须在类声明的外部初始化,static 成员变量的内存既不是在声明类时分配,
    //也不是在创建对象时分配,而是在(类外)初始化时分配.没有在类外初始化的 static 成员变量不能使用
    int Person::cont = 0;
    
    
    
    void dofun() {
        //通过类访问。
        Person::cont = 10;
    
        //通过对象访问。
        Person p("sd", 33, 60);
        cout << p.cont << endl;
    
    
        return;
    }
    
    int main() {
        dofun();
    
        return 0;
    }

    静态成员函数

    #if 0
    #include <iostream>
    #include <string>
    using namespace std;
    
    /*编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,
    并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。
    而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
    */
    
    /*普通成员函数有 this 指针,可以访问类中的任意成员;
    而静态成员函数没有 this 指针,
    只能访问静态成员(包括静态成员变量和静态成员函数)*/
    
    /*
    所有对象共享同一个函数
    只能访问静态成员变量
    */
    class Person {
    public:
    
        static void getcount() {
            age = 22;//静态函数内部能访问
            //score = 60;//非静态变量不能被访问,因为静态独占内存。
            cout << "Static func" << endl;
        }
    
        static int age;//静态变量
        int score;//非静态变量
    
    };
    
    
    int Person::age = 0;
    
    
    void dofun() {
    
        //1.类访问
        Person::getcount();
    
    
        //2.对象访问
        Person p;
        p.getcount();
    
        return;
    }
    
    int main() {
        dofun();
    
        return 0;
    }
    #endif // 0

    成员变量和成员函数分开存储

    #if 0
    #include <iostream>
    using namespace std;
    
    /*
    Person p
    */
    
    
    /*1.
    cout << "空类对象占用内存:" << sizeof(p) << endl;
    占1字节,C++为区分空间对象位置所以分配一份空间
    */
    class Person {
    
    };
    
    /*2.
    cout << "空类对象占用内存:" << sizeof(p) << endl;
    4字节。int age属于类对象中的数据
    */
    class Person2 {
        int age;
    
    };
    
    /*3.
    cout << "空类对象占用内存:" << sizeof(p) << endl;
    4字节。函数成员不属于类对象中的数据。
    */
    class Person3 {
        int age;
        void func() {};
    
    };
    
    void Enter() {
        Person p;
    }
    
    int main() {
        Enter();
        return 0;
    }
    
    #endif // 0

    常函数和常指针

    #include <iostream>
    using namespace std;
    
    
    
    /*如果一个成员函数中没有调用非常量成员函数,
    也没有修改成员变量的值,那么将其写成常量成员函数
    */
    
    class Person {
    
    
    public:
        void func() const//1.常函数
        {
            //age = 10;//常函数内部不能访问this->age。
            score = 60;//常变量,只有常函数可以访问
            cout << score << endl;
    
        }
    
        int age;
        mutable int score; //常变量,只有常函数可以访问
    };
    
    
    
    
    int main() { 
        const Person p1;//常对象只能调用常函数
        p1.func();
    
        Person p;
        p.func();
    
        return 0; 
    }

    This指针

    #if 0
    #include <iostream>
    using namespace std;
    
    /*this 是一个指针,它指向当前对象,通过它可以访问当前对象的所有成员。
    要用->来访问成员变量或成员函数。
    理解成python中的self。
    */
    
    class Person {
    public:
        int age;
    
        Person(int age)
        {
            this->age = age;//this指向当前类中的age
        };
    
    
    };
    
    
    
    
    int main() {
    
        Person p(18);
        cout << p.age << endl;
    
        return 0;
    }
    #endif // 0
  • 相关阅读:
    nvm安装及使用(windon/mac)
    JVM学习笔记
    Java多线程
    OkHttpClient调优案例
    Java各版本新增特性, Since Java 8
    Linux下MySQL数据库的备份与恢复
    算法和数据结构学习笔记
    联想台式机安装网卡驱动指南
    解决「现有新的ios更新可用,请从ios14 beta 版更新」问题
    linux 命令英文全称(转帖)
  • 原文地址:https://www.cnblogs.com/cou1d/p/14269215.html
Copyright © 2011-2022 走看看