初学C++
下面我们通过一个Person类来学习C++
#include<iostream>
#include<string>
using namespace std;
//定义一个Person的类
class Person
{
public:
/*
要点:
1.构造函数是为了生成具体的对象
2.构造函数的**名称**必须与**类名**一致
3.构造函数没有返回值,也没有void
*/
Person();//默认构造函数
Person(char* name,int age,char sex,float height,float weight)//有参构造
{
m_name=new char[strlen(name)+1];
strcpy(m_name,name);
m_age=age;
m_sex=sex;
m_height=height;
m_weight=weight;
cout<<"普通构造"<<endl;
}
Person(const Person& p)//拷贝构造
{
/* if(m_name)
delete [] m_name; */
m_name=new char[strlen(p.m_name)+1];
strcpy(m_name,p.m_name);
m_age=p.m_age;
m_sex=p.m_sex;
m_height=p.m_height;
m_weight=p.m_weight;
cout<<"拷贝构造"<<endl;
}
~Person()//析构函数用来销毁对象
{
cout<<"析构函数"<<m_name<<endl;
if(m_name)
delete [] m_name;
}
//运算符的重载
bool operator<(const Person& p);
bool operator==(const Person& p)
{
return m_age==p.m_age&&strcmp(m_name,p.m_name)==0;
}
//赋值运算符的重载的返回值必须为 :类名&
Person& operator=(const Person& p)
{
if(m_name)
delete [] m_name;
m_name=new char[strlen(p.m_name)+1];
strcpy(m_name,p.m_name);
m_age=p.m_age;
m_sex=p.m_sex;
m_height=p.m_height;
m_weight=p.m_weight;
cout<<"赋值"<<endl;
return *this;
}
private:
char* m_name;
int m_age;
char m_sex;
float m_height;
float m_weight;
};
Person::Person()
{
m_name=new char[1];
*m_name='\0';
m_age=0;
m_sex='M';
m_height=0.0f;
m_weight=0.0f;
cout<<"默认构造"<<endl;
}
bool Person::operator<(const Person& p)
{
//以年龄为标准
return m_age<p.m_age;
}
int main()
{
Person a;//因为没有参数,所以调用默认构造方式
Person b("tom",25,'M',1.86f,80.1f);//b是调用普通构造函数生成的
Person c("lily",22,'F',1.68f,49.0f);//c也是调用普通构造函数生成的
Person d(b);
Person e=b;//拷贝构造,不是赋值
a=c;
return 0;
}
运行结果如下:
知识点:
- public:都可以访问
private:只有类内的函数可以访问
protected:子类可以访问
成员(变量)和方法(函数)被封装到一个类中,一般成员设为private(私有);定义类时,与C语言中的定义结构体类似,不要忘记在大括号后加分号 - 构造函数的名称必须与类名一致;构造函数没有返回值,也没有void
- 赋值运算符的重载的返回值必须为 :类名&
- Person e=b;是拷贝构造,相当于Person e(b),而不是相当于Person e; e=b;
- 程序结束时会调用析构函数,来销毁每一个对象,我们通过运行结果可以发现生成对象和销毁对象的顺序是相反的,类似于进栈出栈的顺序