c++ primer 学习记录

c++ primer类(1)

#include<iostream>
#include<vector>
using namespace std;

class Screen {
public:
    typedef string::size_type pos;
    //为了不显示contents的类型,定义pos名字
    //等价写法:using pos = string::size_type
    //定义类型的成员必须先定义后使用
    Screen() = default;//必须先写默认构造函数,以免写了有参构造忘写无参构造
    Screen(pos ht,pos wd,char c):height(ht),width(wd),contents(ht*wd,c){ }
    //string类型变量内部都是统一字符,初始化可以用(size,'char name')来自动初始化
    char get() const {return contents[cursor];}
    //不包含改值内容的函数一定要写const
    inline char get(pos ht,pos wd) const;
    //函数功能少,显示内联
    Screen &move(pos r,pos c);
    //改变对象的函数用 <typename>& 来声明返回值
    void some_member() const;
    Screen& set(char);
    Screen& set(pos,pos,char);
    Screen& display(ostream &os){do_display(os);return *this;}
private:
    pos cursor = 0;
    pos height = 0,width = 0;
    string contents;
    mutable size_t access_ctr;
    void do_display(ostream &os) const{os << contents;}
};
inline Screen& Screen::set(char c){
    contents[cursor] = c;
    return *this;
}

inline Screen& Screen::set(pos r,pos col,char ch){
    contents[r*width + col] = ch;
    return *this;
}

inline 
Screen &Screen::move(pos r,pos c){
    pos row = r * width;
    cursor = row + c;
    return *this;
}
//类外定义改变类的函数,要用this指针
//this存了类变量的存储条首地址
char Screen::get(pos r,pos c) const{
    pos row = r * width;
    return contents[row + c];
}
void Screen::some_member() const{
    ++(this->access_ctr);
    //后缀运算符优先级高于前缀运算符
    //&&运算符比||运算符优先级高
    //运算数优先级最高
    //->运算符属于后缀运算符
    //强制类型转换优先级比四则运算优先级高
    //四则运算符优先级比关系运算符和位运算符高
    //命题逻辑运算符优先级低于关系运算符
    //赋值运算符和逗号运算符优先级最次
};

//定义一个新类
class Window_mgr{
private:
    //在类内初始化一个实例要用花括号并且内部要写构造函数传参表达式
    vector<Screen> screens{Screen(24,80,' ')};
};

class Screen1{
private:
    string contents;
    int height = 0;
    int width = 0;
public:
    Screen1() = default;
    Screen1(int ht,int wd):height(ht),width(wd),contents(" ") { };
    Screen1(int ht,int wd,char c):height(ht),width(wd),contents(ht*wd,c) { };
    Screen1& set(char);
    //Screen1& set(pos,pos,char);
    //函数不确定形参名字,可以实现声明类型,直到正式声明时再给定名称,但声明了就一定要给出正式定义
};
//类最后要写分号
//列表初始化后面要加一个花括号并且末尾加分号


int main(int argc, char const *argv[])
{
    //Screen myScreen = new Screen;new是动态内存分配用法,new对象在c++应该是个指针
    //myScreen.move(4,0).set('#');
    //连续调用两次成员函数,等价于分开写的形式
   // myScreen.set('$').display(cout);
    //ostream& 类型传cout
    Screen myScreen(5,5,'x');
    myScreen.move(4,0).set('#').display(cout);
    cout << "\n";
    myScreen.display(cout);
    cout << "\n";
    return 0;
}

class Link_Screen{
    friend class 
    Screen window;
    Link_Screen *next;
    Link_Screen *prev;
    Link_Screen &p;
};
//c++类里面允许定义指向自己的指针和引用
//field 'window' has incomplete type 'Link_Screen',类型不完全错误,不能再类里面声明自己的实例

class X{
    Y *ptr;
};

class Y{
    X x_in_y;
};


发布了2 篇原创文章 · 获赞 0 · 访问量 40

猜你喜欢

转载自blog.csdn.net/AIGNl/article/details/104342683
今日推荐