我是靠谱客的博主 奋斗白猫,最近开发中收集的这篇文章主要介绍C++ 构造函数与对象指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

构造函数:

函数名与类名相同

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

构造函数不能被调用

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

构造函数有以下几种:

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

#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、含参:初值由用户输入,可以进行对不同对象的初始化

#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;
}

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

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

构造函数的重载:

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

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

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

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

比如:

Example(int = 0,int = 10,int = 4);
//这是一个全部为默认参数的构造函数
Example(int,int);
//这是一个有两个参数的构造函数
Example example1(1,0);

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

析构函数:

~构造函数

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

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

二、对象数组

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

例:

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

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

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++ 构造函数与对象指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部