C++——类与对象

preface:感谢张三李四小明的友情赞助,撒花
1.类

类声明格式

class className
{
private:
		data member declaration
public:
	member function prototypes
};

类定义简单例子

class Person {
private:
	string name;
	string sex;
	int age;
	double salary;
	double annual_salary;
	void total_salary() { annual_salary = 12 * salary; }
public:
	void initial(const string & na, string s, int a, double sa);
	void show();
};

1.1访问控制

类设计尽可能将公有接口和实现细节分开,两个关键字private和public描述了对类成员的访问控制。private成员只能通过公有成员函数(或友元函数)来访问,防止程序直接访问数据被称为数据隐藏。数据隐藏(将数据放在类中的私有部分中)是一种封装。

#include<iostream>
#include<string>
using namespace std;
class Person {
private:
	string name;
	string sex;
	int age;
	double salary;
	double annual_salary;
	void total_salary() { annual_salary = 12 * salary; }
public:
	void initial(const string & na, string s, int a, double sa);
	void setname(string na);
	void setsex(string s);
	void setage(int a);
	void setsalary(double sa);
	void show();
};
void Person::setname(string na)
{
	name = na;
}
void Person::setsex(string s)
{
	sex = s;
}
void Person::setage(int a)
{
	age = a;
}
void Person::setsalary(double sa)
{
	salary = sa;
	total_salary();
}
void Person::show()
{
	cout << "name: " << name << " sex: " << sex << "  age: " << age 
		<< "  salary: " << salary << "  annual_salary: " << annual_salary << endl;
}

void Person::initial(const string & na, string s, int a, double sa)
{
	name = na;
	sex = s;
	age = a;
	salary = sa;
	total_salary();
}
int main()
{
	Person x_ming;
	x_ming.initial("x_ming", "man", 20, 90.670);
	x_ming.show();
	Person z_sang;
	z_sang.setname("z_sang");
	z_sang.setsex("man");
	z_sang.setage(23);
	z_sang.setsalary(80.03);
	z_sang.show();
	Person *pl_si = new Person;
	pl_si->setname("l_si");
	pl_si->setsex("man");
	pl_si->setage(26);
	pl_si->setsalary(112.23);
	pl_si->show();
	system("pause");
	return 0;
}

name: x_ming sex: man  age: 20  salary: 90.67  annual_salary: 1088.04
name: z_sang sex: man  age: 23  salary: 80.03  annual_salary: 960.36
name: l_si sex: man  age: 26  salary: 112.23  annual_salary: 1346.76
请按任意键继续. . .

tip:name,sex,age,salary都是私有变量,不能直接访问,通过公有成员函数访问。若是这样:error!!!!

Person Mrerror;
Mrerror.name = "Mrerror";
Mrerror.sex = "man";
Mrerror.age = 1024;
Mrerror.salary = 0.00;

1.2封装

简单的谈一下封装吧,private关键字为了更好的隐藏类的内部实现。不希望外部知道的、或者只在类内部使用的、或对外部没有影响的成员,都建议声明为private。

好的,声明为private之后怎么访问呢,上面的代码已经很清楚了。添加public 属性的成员函数,一个用来设置成员变量的值,一个用来修改成员变量的值。上面的代码中,setname()、setage()、setsex() 函数就用来设置成员变量的值;如果希望获取成员变量的值,可以再添加三个函数 getname()、getage()、getsex()。  

给成员变量赋值的函数通常称为 set 函数,它的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它的名字通常以get开头,后跟成员变量的名字。

当然还可以使用构造函数啦

1.3成员名和参数名

代码请见1.1中标紫色部分。刚接触类,在coding中可能会犯这样的迷糊,就是我这么写

void Person::initial(const string & name, string sex, int age, double salary)

或者接下来会有的构造函数比如

Person::Person(const string & name, string sex, int age, double salary)

也就是将成员变量名称用作参数名了,这是不对的!!!

构造函数(成员函数)的参数不是类成员,而是赋给类成员的值。因此,参数名不能和类成员相同,否则,代码会变成这样

name = name;
sex = sex;
age = age;
salary = salary;

可怕,为了避免这样的情况,有两种方法。

a.在成员变量加前缀m_,这样

class Person {
private:
	string m_name;
	string m_sex;
	int m_age;
	double m_salary;
	double m_annual_salary;
}

b.在成员变量使用后缀_,这样

class Person {
private:
	string name_;
	string sex_;
	int age_;
	double salary_;
	double annual_salary_;
}
1.4对象指针
Person *pl_si = new Person;
使用new关键字,有了对象指针,通过->来访问对象的成员变量和成员函数,和结构体指针访问结构体成员类似。这样
pl_si->setname("l_si");
pl_si->setsex("man");
pl_si->setage(26);
pl_si->setsalary(112.23);
pl_si->show();
1.5内联方法

位于类声明中的函数都将自动成为内联函数,因此,Person::total_salary()是一个内联函数。也可以在类声明之外定义成员函数,并让他成为内联函数。只需在类实现部分中定义函数时使用inline限定符就ok。这样

class Person {
private:
	...
	void total_salary();
public:
	...
}
inline void Person::total_salary()
{
	total_salary = 12 * salary;
}

附:关键字class和class的区别

使用class和struct都可以创建类。如果使用class,类成员在默认状态下是私有的,而struct,类成员在默认状态下是公有的。

class C {
	int x;
public:
	void setx(int x);
};
等价于
struct C {
	void setx(int x);
private:
	int x;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值