我是靠谱客的博主 奋斗白猫,这篇文章主要介绍C++ 构造函数与对象指针,现在分享给大家,希望可以做个参考。

一、对类对象进行初始化,不能在声明中进行,要使用构造函数。

构造函数:

函数名与类名相同

也可以和其他函数一样在类外定义,没有返回值(但也不用void修饰)

构造函数不能被调用

构造函数是定义对象的时候调用的,只执行一次

构造函数有以下几种:

1、不含参:初值自己定义好

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream> using namespace std; class Time{ //声明Time类 public: Time(){ //不含参的构造函数,也可以在类外定义 hour = 0; minute = 0; sec = 0; } void set_time(); //用于赋值,覆盖初值 void show_time(); //输出值 private: int hour; int minute; int sec; }; void Time::set_time(){ //类外定义函数 cin>>hour; cin>>minute; cin>>sec; } void Time::show_time(){ cout<<hour<<":"<<minute<<":"<<sec<<endl; } int main(){ Time t1; //建立一个对象,调用函数 t1.set_time(); t1.show_time(); Time t2; t2.show_time(); //t2只调用输出函数,输出的即为初值 return 0; }

2、含参:初值由用户输入,可以进行对不同对象的初始化

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream> using namespace std; class Box{ public: Box(int,int,int); //声明带参数的构造函数,并在类外定义 int volume(); //函数声明,用于计算体积 private: int height; int width; int length; }; Box::Box(int h,int w,int l){ //参数具体值由对象传入,没有返回值 height = h; width = w; length = l; } int Box::volume(){ return (height*width*length); } int main(){ Box box(12,25,30); //定义对象并传入初始值 cout<<"volume is "<<box.volume()<<endl; }

上面这种构造函数也可以写成一下这种参数初始化表

复制代码
1
2
Box::Box(int h,int w,int l):height(h),width(w),length(l){} //后面花括号可以是空的,代表,没有赋值以外的语句要执行

构造函数的重载:

(1)一个类中只能有一个默认构造函数(程序中已设定了全部属性的初值),如果没有无参构造函数,并且用户没有定义构造函数,系统会自动提供一个默认构造函数,但是里面是空的,没有初值。

(2)重载不能在以下几种情况进行:

1、无参构造函数和全部参数指定初值的构造函数(若出现不输入实参的对象,二者作用重复)

2、全部是默认参数的构造函数和其他重载构造函数

比如:

复制代码
1
2
3
4
5
6
Example(int = 0,int = 10,int = 4); //这是一个全部为默认参数的构造函数 Example(int,int); //这是一个有两个参数的构造函数 Example example1(1,0);

这时候会发现example1调用哪个构造函数都可以,会出现歧义

析构函数:

~构造函数

用处:撤销对象占用的内存之前完成清理工作,使清理好的这部分内存可以被程序分配给新对象使用

先构造的后析构,后构造的先析构。

二、对象数组

顾名思义,是由对象组成的数组

例:

复制代码
1
2
Student stu[20]; //在已有Student类基础上,建立一个数组,里面有20个对象

可以像普通数组那样赋值,但只能是构造函数有一个参数时。如果构造函数有多个参数,可以用以下方法定义:

复制代码
1
2
3
4
5
6
7
8
9
Student stu[3] = { //定义有三个对象的对象数组 Student(1,18,87); //调用第一个元素的构造函数,并输入三个实参 Student(2,19,76); //第二个对象 Studnet(3,18,72); //第三个对象 };

三、对象指针

1、指向对象的指针:

类名 *对象指针名;   //定义指针

类名 对象名;  //定义一个对象

指针名 = &对象;  //将对象的地址赋给指针

注意:指针名指向的是对象的地址,而(*指针)指向的是对象本身。

因此想要用指针访问对象的公有成员,就需要如下步骤:

(*指针名).共有成员名;

指针名->共有成员名;         //调用函数是同样的两种方法

2、指向对象成员的指针

(1)指向数据成员的指针

数据类型名 *指针变量名;

指针名 = &对象.数据成员;    //当数据成员为公用

 (2)指向成员函数的指针

数据类型名(类名::*指针变量名)(参数表列);

指针变量名 = &类名::成员函数名;

 3、指向当前对象的this指针

this->数据成员

(*this)代指对象本身,上面这句话也可以变成  (*this).数据成员

四、共用数据的保护(const的使用)

1、常对象,该对象里所有数据成员的值都不能改变

类名 const 对象名【(实参表)】;

 常对象可以有常成员函数和普通成员函数,但外界调用只能调用常成员函数,而不能调用普通函数。

常成员函数可以访问常对象中的数据成员,但不能改变他的值

2、常数据成员

注意:只能通过构造函数的参数初始化表对常数据成员进行初始化

const 数据类型 数据名;

3、常成员函数

常成员函数可以引用类中的数据成员,但不能修改他们的值(不论是不是常数据)

类型名 函数名(参数表) const

4、指向对象的常指针

当指针被const修饰时即变为常指针时,常指针始终指向一个对象,不能改变指向

类名 *const 指针变量名 = &对象;

5、指向常对象的指针变量

const 类型名 *指针变量名;

注意:(1)常变量的指针只能是指向常变量的指针,不能是一般的指针变量

(2)指向常变量的指针可以指向不被声明为const的变量,只不过此时不能用此指针改变变量的值,但是变量本身想怎么变就怎么变,即为在指针访问它的期间,它具有常变量的特征,不被引用时就是普通的变量

6、常引用

常用于函数形参

我们知道函数形参和实参不是一个东西,他们使用了两个不同的存储单元

那么只要使用指针或者引用(也叫别名),形参实参处于同一地址中,在函数中对形参作出改变就能传到实参那里去

如果不想让实参对象的值发生变化,就会用到常引用

上面讲的常指针的主要用处也是作为函数的形参,理由同上

类型名 函数名(const 类名 &别名){ }

最后

以上就是奋斗白猫最近收集整理的关于C++ 构造函数与对象指针的全部内容,更多相关C++内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部