C++初级-类与对象(1)
1.类的两种定义方式
(1)将声明和定义全部放在类体中。注意:成员函数在类内定义,编译器有可能将其当做内联函数处理。
class Person
{
private:
string _name;
string _sex;
int _age;
public:
void display()
{
cout<<_name<<" "<<_sex<<" "<<_age<<endl;
}
};
(2)声明放在.hpp文件中,定义放在.cpp文件中
.hpp(声明)
public:
void display();
.cpp(定义)
void Person::display()
{
cout<<_name<<" "<<_sex<<" "<<_age<<endl;
}
2.类的访问限定符
(1)public修饰的成员在类外可以直接被访问
(2)protected和private修饰的成员在类外不可以被直接访问
(3)class的默认访问权限为public,private和struct
(4)访问权限作用域:从该访问限定符出现的位置直到下一个访问限定符出现为止
3.封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
4.在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域。
5.类不占用空间,实例化对象才占用空间。
6.类的大小,实际为该类中成员变量之和。
#include"date.hpp"
#include<iostream>
using namespace std;
int main()
{
Date d1,d2;
d1.setDate(1,2,3);
d1.display();
d2.setDate(5,6,9);
d2.display();
return 0;
}
#pragma once
#include<iostream>
using namespace std;
class Date
{
private:
int _y;
int _m;
int _d;
public:
void setDate(int y,int m,int d)
{
_y=y;
_m=m;
_d=d;
}
void display()
{
cout<<_y<<" "<<_m<<" "<<_d<<endl;
}
};
6.this指针
this指针是编译器为每个成员函数增加的一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),函数体中所有成员变量的操作,都是通过该指针去访问。
(1)指针类型:类类型* const
(2)只能在成员函数的内部使用
(3)this指针实质上是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针。
(4)this指针是成员函数第一个隐含的指针形参,一般情况下有编译器通过ecx寄存器自动传递,不需要用户传递。
void display(Date* const this)
{
...this->_y...
}
7.构造函数:特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,从而保证每个数据成员都有一个合适的初始值,并且在对象的生命周期内只调用一次。用来初始化对象。
(1)函数名与类名相同
(2)无返回值
(3)构造函数可以重载
(4)当对象实例化时编译器会自动调用对应的构造函数
#pragma once
#include<iostream>
using namespace std;
class Date
{
private:
int _y;
int _m;
int _d;
public:
//带参构造
Date(int y,int m,int d)
{
_y=y;
_m=m;
_d=d;
}
//无参构造
Date()
{
}
void display();
};
#include"date.hpp"
#include<iostream>
using namespace std;
void Date::display()
{
cout<<_y<<" "<<_m<<" "<<_d<<endl;
}
int main()
{
Date d1;//调用无参构造,无需括号
d1.display();
Date d2(2002,5,8);//调用带参构造
d2.display();
return 0;
}
注意:
(1)假若类中没有显式定义构造函数,则编译器自动生成无参的默认构造函数,但是一旦具有显式定义,编译器将不再生成。
(2)无参构造和全缺省的构造函数都被称为默认构造函数,并且默认构造函数只允许有一个。无参构造和全缺省的构造函数都是默认成员函数。
(3)编译器生成的默认构造函数会对自定义类型成员调用它的默认成员函数。
#include"date.hpp"
#include<iostream>
using namespace std;
void Date::display()
{
cout<<_y<<" "<<_m<<" "<<_d<<endl;
}
int main()
{
Date d1;
d1.display();
return 0;
}
#pragma once
#include<iostream>
using namespace std;
class Time
{
private:
int _h;
int _mi;
int _s;
public:
Time()
{
cout<<"Time()"<<endl;
_h=0;
_mi=0;
_s=0;
}
};
class Date
{
private:
int _y;
int _m;
int _d;
Time _time;
public:
void display();
};
8.构造函数:特殊的成员函数
(1)对象在销毁时会自动调用析构函数,完成类的一些资源清理工作
(2)析构函数名为类名前加上字符~
(3)无参数,无返回值
(4)一个类有且仅有一个析构函数,若未显式定义,系统会自动生成默认的析构函数
(5)主要完成开辟空间的对象的销毁,其余由编译器完成销毁工作。
#include"date.hpp"
#include<iostream>
using namespace std;
int main()
{
Person p;
return 0;
}
#pragma once
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
class String
{
private:
char* _str;
public:
String(const char* str="fgh")
{
_str=(char *)malloc(strlen(str)+1);
strcpy(_str,str);
}
~String()
{
cout<<"~String()"<<endl;
free(_str);
}
};
class Person
{
private:
String _name;
int _age;
};