C++基础提高(二)

指向类成员的指针、、、、、、、、、指向类成员函数的指针
/////////////////
作用: 实现更加隐秘的接口。。。实现更加同一的接口

#include <iostream>
using namespace std;

class Game
{
public:
    void select(int i)
    {
        if(i>=0&&i<=3)
        {
           (this->*pf[i])(i);
        }
    }
    Game()
    {//初始化
        pf[0]=Game::f;
        pf[1]=Game::g;
        pf[2]=Game::h;
        pf[3]=Game::j;
    }
private:
    void f(int idx) {cout <<"void f(int idx)"<<idx<<endl;}
    void g(int idx) {cout <<"void g(int idx)"<<idx<<endl;}
    void h(int idx) {cout <<"void h(int idx)"<<idx<<endl;}
    void j(int idx) {cout <<"void j(int idx)"<<idx<<endl;}

    enum {
        nc=4
    };
    //定义指针数组
    void (Game::*pf[nc])(int idx);

};

int main()
{
    Game h;
    h.select(2);

    return 0;
}

const 成员函数承若在本函数内部不会修改类的数据成员函数,只能调用不能改变的非const成员

0

C++ 学习基础与提高(一)

游戏开发cocos
手机APP开发crossApp

C++开发环境 VS/QT
C++书籍,
– C++ primer plus
– THInking in C++
– problem Solving with C++

C++类型增强

析构器不是必须的,在没有堆空间下,用默认就好,在有堆空间下,不可或缺,
析构器在对象销毁时自动调用

层级管理,只对本层内存负责(在那一层new的,在那一层delete)

多文件编程(通常将类的声明名放到.h文件中而将实现放到.cpp中)

如果对象中不含有堆上的空间,那么浅拷贝满足需求,如果对象中含有堆上空间,则浅拷贝不满住需求(浅拷贝会出现重析构)

类构造函数中如果有默认参数,默认参数必须在声明中,而不能在实现中
this指针作为函数参数隐式传进来,不占用对象体积大小
C++类型强转 static_cast

栈对象返回问题
栈对象可以返回,不可以返回栈上的引用

一个 对象所占空间只取决于对象数据成员所占空间,而与成员函数无关;
引用—相当于扩展了作用
const不可以修饰全局函数,智能修饰内成员函数
类的静态成员属于类,也属于对象,但最终属于类
static 主要实现共享,协作问题
如果可以共享又不能更改这设为static const
static修饰函数,目的是为了管理静态变量。静态成员函数只能访问静态成员,不能访问非静态成员,因为静态成员函数没有this指针,但是可以在静态成员函数中用对象调用。
类的静态成员可以通过静态成员函数调用,在内外用类名::静态成员函数调用,这里可以看出静态成员函数相当于一个静态成员与外界的接口。
类的静态成员在内外可以用类名::静态成员调用,非静态成员在内外只能通过内对象调用。
类的静态成员不影响类的大小。
单例模式(一个类只能建立一个对象)(见new,见delete,不见new,不见delete)
#include

using namespace std;
class sigclass
{
public:
    static sigclass * getsigclass()
    {
        if (ins_==nullptr)
            ins_ =new sigclass;

        else
            return ins_;
//        cout<<ins_<<endl;
    }

    static void releaseInstance()
    {
        if(ins_ !=nullptr)
        {
            delete ins_;
            ins_=nullptr;
        }
    }
private:
    sigclass(){}
//    ~sigclass(){}
    sigclass(const sigclass&){}
    sigclass & operator =(const sigclass &){}

    static sigclass *ins_;

};
sigclass *sigclass::ins_ =nullptr;
int main()
{
    sigclass *ps =sigclass::getsigclass();
    sigclass::releaseInstance();
//    cout<<ps<<endl;
//    delete ps;
    return 0;
}

链表插入:
让新来的节点线有所指向

0

C++ 如何仅在堆上(栈上)创建对象

静态建立时,编译器自动调用构造函数在栈上形成一个对象
动态建立时,编译器先执行operator new(),然后在渐渐调用类的构造函数初始化堆上的内存

在堆上创建对象

  • 不能将构造函数设为私有,因为动态建立时也要调用构造函数,私有变量不能再内外访问
  • 在为类创建对象时在栈上分配空间时,编译器会检查非静态函数的访问性,可以将析构函数设为私有。当析构函数设为私有时,编译器不会在栈上建立对象,但是这样子类不访问基类的析构函数,在继承上会有问题,可以考虑将析构函数设为protect,既可以满足继承问题,也可以实现不被内外访问。

在栈上建立对象

只要禁用了new即可,可将new设为私有变量

0