面向对象编程的优势
- 相比于分而治之的结构化程序设计,强调大处着眼的面向对象程序设计的思想,更适合于开发大型软件。
- 得益于数据抽象、代码复用等面象对象的固有特征,软件开发的效率获得极大的提升,成本却大幅降低。
面向对象三大特征:封装、继承、多态。
结构体
#include <iostream>
using namespace std;struct Compleac{double i;double r;void init(double rr, double ii) {i = ii;r = rr; }double real() {return i;}double image() {return r;}
};int main(int argc, const char *argv[])
{Compleac a;a.init(3,5);cout << a.real() << " + " << a.image() << "i" << endl;return 0;
}
将数据和操作数据的函数包装在一起的主要目的就是实现的封装和隐藏。隐藏就是不让结构体外的函数直接修改数据结构中的数据,只能通过结构的成员函数对数据进行修改。但上面的代码显然没能做到这一点。为此C++中新增了3个访问权限限定符,用于设置结构体中数据成员和数据成员的访问权限。
- public
公有成员(函数、数据),可悲任何函数访问(结构体内和结构体外)
- protected
与继承有关
- private
私有成员(函数、数据),只能被结构体内部函数访问。
#include <iostream>
using namespace std;struct Compleac{
private:double i;double r;
public:void init(double rr, double ii) {i = ii;r = rr; }double real() {return i;}double image() {return r;}void set_real(double value) {i = value;}void set_image(double value) {r = value;}
};int main(int argc, const char *argv[])
{Compleac a;
// a.i = 8;//因为private缘故无法直接修改a.init(3,5);a.set_real(8);a.set_image(10);cout << a.real() << " + " << a.image() << "i" << endl;return 0;
}
类
struct还是容易和传统C语言中的结构混淆,C++中引进了功能和struct相同,但更安全的数据类型:类。更安全是指结构体将所有成员都默认为public,不够安全;类中成员默认为private权限。
//语法格式
class 类名 {
private:成员类型成员类型
public:成员数据:成员数据:
protected:成员数据:成员数据:
};//特别注意;不要忘了
#include <iostream>
using namespace std;class Compleac{
private:double i;double r;
public:void init(double rr, double ii) {i = ii;r = rr; }double real() {return i;}double image() {return r;}void set_real(double value) {i = value;}void set_image(double value) {r = value;}
};int main(int argc, const char *argv[])
{Compleac a;
// a.i = 8;//因为private缘故无法直接修改a.init(3,5);a.set_real(8);a.set_image(10);cout << a.real() << " + " << a.image() << "i" << endl;return 0;
}
#include <iostream>using namespace std;class stu {private:string m_name;int age;int num;
public:void set_name(const string & name) {m_name = name;}void set_age(int s_age) {age = s_age;}void set_num(int s_num) {num = s_num;}void who() {cout << "我叫" << m_name << "我今年" << age << "我的学号是" << endl;}
};int main(int argc, const char *argv[])
{stu s;s.set_name("小明");s.set_age(18);s.set_num(8499);s.who();return 0;
}