C++菜鸟进阶——>指针、引用和构造函数初始化
答:(1) 学习C++的你应该学过C基础,在C语言里指针是:指向同一类型变量地址,比如 int * p = & a;//a是int 型的,那么同理在C++也是一样的,比如类A;A a;A *p = & a;//A就像int 。不过,C++中指针大多是这样使用:A*p = new A;既然指针是指向一片空间的地址,那么指针p在此就是指向类A的首地址,可以发现p指向A类在堆区开辟空间的一个首地址,那么p 就以访问A类中所有的成员变量和成员函数,不过最后一定记得在析构函数中delete p;不然会造成内存泄漏,你会发现电脑越来越卡。
(2) 同样的,在C++中,指针还可以这样使用,类B继承于类A,A * p = new B;,你看由于p是A类型指针,所以它最多能指到B中的A内容。(希望此图对你有所帮助)指向基类指针如果指向派生类,它指指向自己的那一部分,然而如果派生类指针指向基类就错了,因为它可能访问到不可预知的内存空间,其实简而言之就是B比A大,B指针指向了B比A大的那一部分,恰巧那一部分是没有的。
2. C++中的引用?
答:引用明面上称之为一个变量的别名,实质上成为一个受限的指针,因为在编译器底层它还是以指针的形式实现的。C++中用到引用的地方有很多,因为你创建一个指针编译器是要给这个指针开辟地址的,但是引用就不会开辟地址,比如:A *p = & a;那么a的地址是 0X00000000,而p本身的地址是0X00000001,不过p存放了a的地址而已。不过A &m = a; a的地址还是0X00000000,m的地址还是0X00000000,此处a==m,它们是相等的。所以m不占内存,对m的操作就是对a的操作。C++中很多会遇到引用传参,比如:void fun(int &p);//这里有个判断是不是引用的方法,等号左边有取地址符就是引用。这里括号内 int &p = a;//(int a)
还有一点:引用用在重载中要注意一下,重载:同一个类中多个函数名相同,参数不同,通过不同参数来调用,比如void fun(int x)和 void fun(int &x)两个函数,编译器认为是重载,但是一运行就是出错。其实两个是一样的。
3. 构造函数初始化
答:这的初始化既构造函数的初始化,比如代码举例如下:
class Stu{
public:
int age;
int no;
Stu();//这里有三个构造函数
Stu(int x , int y);
~Stu();
}
Stu::Stu():age(100),no(200){ //age=100,no=200;
cout << "Stu::Stu()" <<endl;
}
Stu::Stu(int x ,int y):age(x),no(y){ // 20传给x,x再传给age,10传给y,y传给no
cout << "Stu::Stu(int x , int y):age(x)"<<endl;
}
int mian (){
Stu stu1; // stu1.age = 100,stu1.no =200;
Stu stu2(20,10); // stu2.age = 20,stu2.no = 10;
return 0;
}
以上陈述有啥不对的地方欢迎各位大牛批评指正,我就是一菜鸟,正在C++这条康庄大道上微微前行。