zoukankan      html  css  js  c++  java
  • 从今天开始学好C++

    1.const int x,y;

     int const x,y;

    是等价的xy都是只读变量。

    2.

    #include <iostream>

    using namespace std;
    class Base
    {
    public:
    void show()const
    {
    cout<<"const function"<<endl;
    }
    void show()
    {
    cout<<"normal function"<<endl;
    }
    };

    int main()
    {
    Base b;
    b.show();
    const Base c;
    c.show();
    return 0;
    }

    const 修饰this是可以重载成员函数的。而且const的对象不可以调用费const的成员函数。

    3

    书上说,

    int & modify()const
    {

    return x;
    }这样是有效的,有可能改变const类型的对象,但在gcc中测试无效。

    error: invalid initialization of reference of type 'int&' from expression of type 'const int'|

    4

     1 #include <iostream>
     2 
     3 using namespace std;
     4 class Base
     5 {
     6 public:
     7     void modify()
     8     {
     9         x = 250;
    10         cout<<"i am called!"<<endl;
    11     }
    12 private:
    13     int x;
    14 public:
    15 
    16     Base()
    17     {
    18          x = 0;
    19     }
    20     void show()
    21     {
    22         cout<<x<<endl;
    23     }
    24 
    25 };
    26 
    27 class Drive :public Base
    28 {
    29 
    30 
    31 public:
    32     void modify()
    33     {
    34        1. static_cast<Base>(*this).modify();
    35         2.((Base)(*this)).modify();
    36         3.Base::modify();
    37     }
    38 
    39 };
    40 int main()
    41 {
    42     Drive d;
    43     d.show();
    44     d.modify();
    45     d.show();
    46     return 0;
    47 }

    钱两种均未修改Base::x的值,但是基类的modify函数被调用额。

    5

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main()
    {
    const int x=6;

    *((int *)(&x) ) =8;

    printf("%d,%d ",&x,(int * )&x);
    printf("%d,%d ",x,*(int * )&x);
    return 0;
    }

    在codeblocks下的c工程和++工程的结果不一致。不晓得为甚。

     6.重载或者定义operator=时,注意自我复制。

    class Base
    {
        char * p ;
    
    public:
        Base(const char * p):p(new char[strlen(p)+1])
        {
            strcpy(this->p,p);
        }
        const Base & operator= (const Base & b)
        {
            delete p;
            p = new char[strlen(b.p)+1];
            strcpy(p,b.p);
            return * this;
    
        }
        void show()
        {
            cout<<p<<endl;
        }
    };

    1.加入判断

    if( this == &b)
    return * this;

    2.调整顺序

    3.copy-and-swap

    7.单个对象可能拥有一个以上的地址,父类指针和同类指针指向他的地址很可能不一样。

     1 class Base
     2 {
     3     int x;
     4 
     5 };
     6 class Base2
     7 {
     8     int y;
     9 };
    10 class Derived:public Base2 ,public Base
    11 {
    12     int z;
    13 };
    14 
    15 
    16 int main()
    17 {
    18     Derived a;
    19     Base2 *p2 = &a;
    20     Base * p1 = &a;
    21     cout<<int(p2)<<"  "<<int(p1)<<endl;
    22     return 0;
    23 }

    8.转型会产生副本

    1     Base x;
    2     x.x = 5;
    3     (static_cast<Base>(x)).change(2);
    4     x.show();

    第三行修改的只是x在转型时产生的临时副本,加入直接赋值错误: using temporary as lvalue [-fpermissive]|。

     

  • 相关阅读:
    剑指offer字符串列表
    剑指offer数组3
    剑指offer数组2
    剑指offer数组1
    剑指offer数组列表
    tensorflow+ssd_mobilenet实现目标检测的训练
    Win7+keras+tensorflow使用YOLO-v3训练自己的数据集
    Java是如何实现跨平台的
    Xshell 、PuTTY 复制文件到Linux
    Asp.Net Core2.0在linux下发布
  • 原文地址:https://www.cnblogs.com/fengyehe/p/3178576.html
Copyright © 2011-2022 走看看