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://构造函数,继承自shapeRectangle(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;}
//构造函数,继承自shapeRectangle(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
。 - 如果函数返回一个浮点数,那么返回值类型就是
float
或double
。 - 如果函数返回一个布尔值,那么返回值类型就是
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)常量指针
本质上是一个指针,指向“常量”的指针,即内容不可变。
指向的地址是可变的
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