概述
一、对类对象进行初始化,不能在声明中进行,要使用构造函数。
构造函数:
函数名与类名相同
也可以和其他函数一样在类外定义,没有返回值(但也不用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++ 构造函数与对象指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复