代码注意事项

1、派生类自定义构造函数需继承父类构造

#include<iostream>
using namespace std;

class Shape
{
public:
//构造函数,需要释放
    Shape(int m,int n)
    {
        s_m = m;
        s_n = n;
    }
    //虚函数
    virtual int area()=0;
    //普通成员函数,待会打印
    void printScreen()
    {
        cout<<"s_m:"<<s_m<<"s_n:"<<s_n<<endl;
    }

protected:
    int s_m;
    int s_n;
};

class Rectangle:public Shape
{
public:
    //构造函数,继承自shape
    Rectangle(int m, int n):Shape(m,n)
    {}
     //重写虚函数,void类型与m*n返回类型不一致
     //原来area没参数,这儿的重写应该也没参数,要不然是重载函数了,
    int  area()
     {
        //return 回去面积
        return (s_m*s_n);

     }

};



int main()
{
    Rectangle ret(5,10);
    ret.printScreen();
    return 0;

}
  //构造函数,继承自shape
    Rectangle(int m, int n):Shape(m,n)
    {}

1)
为了确保调用派生类的构造函数的时候,已经调用过基类的某个构造函数,完成了派生类的继承自基类部分的数据成员的初始化。即确保调用顺序是:先调用基类的构造函数,再调用派生类的。

因为,调用派生类的构造函数时,可能会调用继承自基类的函数。因此,调用派生类的构造函数时,必须确保继承自基类的部分已构造完毕,而将基类构造函数的调用写在初始化列表中,能更好地做到这一点。

另外,如果基类不存在默认构造函数,则派生类在进行构造函数的时候,必须将基类的构造函数写在初始化列表中的,否则编译不会通过。也就是说,在派生类进入构造函数之中以后,基类的构造函数默认已经是完成的了。

原文链接:https://blog.csdn.net/weixin_43869898/article/details/105018133
2)

 int  area()
     {
        return (s_m*s_n);
     }

返回值与函数类型一致!!!
在C++中,返回值类型与函数的类型一致。这意味着:

  • 如果函数返回一个整数,那么返回值类型就是int
  • 如果函数返回一个浮点数,那么返回值类型就是floatdouble
  • 如果函数返回一个布尔值,那么返回值类型就是bool
  • 如果函数没有返回值,则返回值类型为void

2、new一new

这里,new int[50]负责在堆(heap)上分配足够的内存来存储50个整数。它返回一个指向这块内存首地址的指针,这个指针的类型是int*(指向整数的指针)。然后,这个返回的指针被赋值给变量p,所以p现在指向这块新分配的内存的首地址。

int *p = new int[50];
for(int i=0;i<50;i++)
  {
   p[i]=i;
  }
  for(int i=0;i<10;i++)
  {
   cout<<"p的地址"<<&p<<endl; 
  cout<<"p的地址"<<&p[i]<<endl; 

  cout<<"i:"<<i<<endl; 
  }
  delete[] p;
p的地址0x7ffd8536a2a8
p的地址0x55aac78862c0
i:0
p的地址0x7ffd8536a2a8
p的地址0x55aac78862c4
i:1
p的地址0x7ffd8536a2a8
p的地址0x55aac78862c8
i:2
p的地址0x7ffd8536a2a8
p的地址0x55aac78862cc
i:3
p的地址0x7ffd8536a2a8
p的地址0x55aac78862d0
i:4
p的地址0x7ffd8536a2a8
p的地址0x55aac78862d4
i:5
p的地址0x7ffd8536a2a8
p的地址0x55aac78862d8
i:6
p的地址0x7ffd8536a2a8
p的地址0x55aac78862dc
i:7
p的地址0x7ffd8536a2a8
p的地址0x55aac78862e0
i:8
p的地址0x7ffd8536a2a8
p的地址0x55aac78862e4
i:9

3 指针常量和常量指针

参考

1)指针常量
本质是个常量。即指针本身是个常量,不可改变,始终指向同一个位置
1、不可改变,根本是常量(指针常量,常量这个词在后面,所以可以即为不可改变)
2、必须初始化
3、指向的内容是可变的,因此修饰的是指针是常量。
记法: int * const p1 , int *是指针,const p1是常量,所以叫指针常量

int main()
{
  //指针常量,本质是个常量
  int a=10,b=20;
  int * const p1 = &a;
  *p1 = 3; //正确
  p1 = &b; //错误


    
    return 0;

}
/mnt/workspace/test/test.cpp:284:6: error: assignment of read-only variable ‘p1’
  284 |   p1 = &b;
      |   ~~~^~~~

2)常量指针
本质上是一个指针,指向“常量”的指针,即内容不可变,常量在前,好比const int a;(p1相当于a,那么p1不能变)。
指向的地址是可变的


int main()
{
  //常量指针,本质是个指针,指向“常量的指针”
  int a=10, b=20;
  const int *p1 = &a; 
  p1 = &b; //正确
  *p1 = 3;//错误
    
  return 0;

}
Consolidate compiler generated dependencies of target main
[ 50%] Building CXX object CMakeFiles/main.dir/test.cpp.o
/mnt/workspace/test/test.cpp: In function ‘int main():
/mnt/workspace/test/test.cpp:285:7: error: assignment of read-only location ‘* p1’
  285 |   *p1 = 3;//错误
      |   ~~~~^~~
make[2]: *** [CMakeFiles/main.dir/build.make:76: CMakeFiles/main.dir/test.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

记忆(常量在前,表示内容不变;常量在后,即指针常量,即指针是常量,即表示指针(地址)不能动)

4 引用

给变量取别名,
int a = 10;
int &b = a;
引用的本质在c++内部实现是一个指针常量,也说明为什么引用不可更改,如上

# include<iostream>
using namespace std;


void Swap(int &a,int &b)
{
  int temp = a;
  a = b;
  b = temp;
}

int& test()
{
  static int a=20;
  return a;


}

int main()
{
  int a = 10;
  int b = 20;
  Swap(a,b);
  cout<<"a:"<<a<<"b:"<<b<<endl;

  //直接接收static型数据
  int &ref2 = test();
  cout << "ref2 = " << ref2 << endl;
  cout << "ref2 = " << ref2 << endl;

  //赋值
  test() = 10000;
  cout << "ref2 = " << ref2 << endl;
  cout << "ref2 = " << ref2 << endl;


  return 0;

}
/mnt/workspace/test> ./main
a:20b:10
ref2 = 20
ref2 = 20
ref2 = 10000
ref2 = 10000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值