C++入门(7):对象
类 = 属性 + 方法;
类名的第一个字母一般采用大写,类声明的末尾必须加上分号“;”;C++允许在类里声明常量,但不允许对它赋值,除非创建一个静态常量。
构造器
1)构造器的名字和它所在类的名字一样;
2)系统会在创建出某个新实例之后,立刻自动调用这个类的构造器;
3)构造器永远不返回任何值。
如果没有在类里定义一个构造器,编译器会自动创建一个,形式为:ClassName::ClassName(){},还会创建一个副本构造器。
构造器经常需要重载,即同一个类可以有多个构造器定义,它们名字一样,只是在输入参数的个数和类型上有差异。
析构器
在销毁一个对象时,系统会自动调用类的另一个特殊方法:析构器;
析构函数名也是类名,只是函数名前多了一个波浪符(~);
析构器永远不返回任何值且不带输入参数,声明只有一种形式:~ClassName()。
this 指针
在类里, this 指针代表当前对象,其基本用途是避免二义性(尤其在引用变量和属性的时候)。
下面通过举例及讲解来认识C++中对象的相关知识:
#include <iostream>
class Student{
public:
static const bool flag = true ; //静态常量,这样是可以的!
char sex;
std::string yourName;
Student(char s); //构造函数,输入参数有默认值时为默认构造器,参数可选,一般来说,每个类至少应该有一个默认构造器
~Student(); //析构函数
void print(std::string name); //给类添加方法:1)先在类的声明里创建一个方法的原型;2)方法的定义(实现)通常在类声明的后面 。
void inputName() ;
};
//如果在类声明里声明和定义函数,其效果等同于在请求编译器把每个函数当做一个内联函数来对待。
Student::Student(char s) //如果构造器声明改为:student(char sex);则为避免二义性,构造器定义中的赋值应改为:this.sex = sex;
{
std::cout << "I am a Constructor." << std::endl;
sex = s;
}
Student::~Student()
{
std::cout << "I am a Destructor." << std::endl;
}
void Student::print(std::string name) //定义类的方法的函数体时,必须指明该方法属于哪个类 :ClassName::functionName
{
std::cout << "Nice to meet you, " << name << std::endl;
std::cout << "You are " << sex << std::endl;
}
void Student::inputName()
{
std::cout << "Honey, what's your name? " << std::endl;
if(flag)
{
std::cin >> yourName;
if(std::cin.good())
{
print(yourName); //类中方法可以相互调用
}
else
{
std::cout << "See you next time." << std::endl;
}
}
}
int main(int argc, char** argv) {
Student student1('F'); //创建类的实例,即对象;由于它的构造函数有参数,所以实例化时需要传入参数
student1.inputName(); //调用类的方法
Student student2 = student1; //把一个对象赋值给另一个同类的对象将使同名的属性有同样的值
std::cout << "student2's sex is " << student2.sex << std::endl; //程序结束之后,需要调用两次析构器
return 0;
}
运行结果为:
I am a Constructor.
Honey, what's your name?
xiuxiu
Nice to meet you, xiuxiu
You are F
student2's sex is F
I am a Destructor.
I am a Destructor.