1.封装 的意义
#include<iostream> using namespace std; const double PI = 3.14159; class Circle { public: int m_r; double cacl() { return PI*m_r *m_r; } }; int main() { Circle one; one.m_r = 12; cout << one.cacl() << endl; system("pause"); return 0; }
设置类的参数:
#include<iostream> using namespace std; class student { public: void setname(string name) { m_name = name; }; void setaage(int age) { m_age = age; }; void setaddress(string address) { m_address = address; }; void print() { cout << "name is" << m_name << " age is " << m_age << " address is " << m_address << endl; } public: string m_name; int m_age; string m_address; }; int main() { student stu; stu.setname("laozhichi"); stu.setaage(18); stu.setaddress("leizhou"); stu.print(); system("pause"); return 0; }
封装意义2
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- public 公共权限
- protected 保护权限
- private 私有权限
2.class和struct的区别
在C++中STRUCT和CLASS唯一的区别就在于默认的访问权限不同
区别:
STRUCT默认权限为公共
默认权限为私有
CLASS
{ int m_A; //默认是私有权限 }; struct C2 { int m_A; //默认是公共权限 }; int main() { C1 c1; c1.m_A = 10; //错误,访问权限是私有 C2 c2; c2.m_A = 10; //正确,访问权限是公共 system("pause"); return 0; }
3. 成员属性设置为私有
通过设置函数访问其中的private等属性
class Person { public: //姓名设置可读可写 void setName(string name) { m_Name = name; } string getName() { return m_Name; } //获取年龄 int getAge() { return m_Age; } //设置年龄 void setAge(int age) { if (age < 0 || age > 150) { cout << "你个老妖精!" << endl; return; } m_Age = age; } //情人设置为只写 void setLover(string lover) { m_Lover = lover; } private: string m_Name; //可读可写 姓名 int m_Age; //只读 年龄 string m_Lover; //只写 情人 }; int main() { Person p; //姓名设置 p.setName("张三"); cout << "姓名: " << p.getName() << endl; //年龄设置 p.setAge(50); cout << "年龄: " << p.getAge() << endl; //情人设置 p.setLover("苍井"); //cout << "情人: " << p.m_Lover << endl; //只写属性,不可以读取 system("pause"); return 0; }
4.构造函数与析构函数
构造函数语法: 类名(){}
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
析构函数语法: ~类名(){}
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,在名称前加上符号 ~
- 析构函数不可以有参数,因此不可以发生重载
- 程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
#include<iostream> using namespace std; class person { public:person() { cout << "你是对的" << endl; } ~person() { cout << "你是错的" << endl; } }; void func() { person p; } int main() { func(); system("pause"); return 0; }
5. 构造函数的分类及调用
//1、构造函数分类 // 按照参数分类分为 有参和无参构造 无参又称为默认构造函数 // 按照类型分类分为 普通构造和拷贝构造 class Person { public: //无参(默认)构造函数 Person() { cout << "无参构造函数!" << endl; } //有参构造函数 Person(int a) { age = a; cout << "有参构造函数!" << endl; } //拷贝构造函数 Person(const Person& p) { age = p.age; cout << "拷贝构造函数!" << endl; } //析构函数 ~Person() { cout << "析构函数!" << endl; } public: int age; }; //2、构造函数的调用 //调用无参构造函数 void test01() { Person p; //调用无参构造函数 } //调用有参的构造函数 void test02() { //2.1 括号法,常用 Person p1(10); //注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明 4.2.3 拷贝构造函数调用时机 C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 示例: //Person p2(); //2.2 显式法 Person p2 = Person(10); Person p3 = Person(p2); //Person(10)单独写就是匿名对象 当前行结束之后,马上析构 //2.3 隐式转换法 Person p4 = 10; // Person p4 = Person(10); Person p5 = p4; // Person p5 = Person(p4); //注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明 //Person p5(p4); } int main() { test01(); //test02(); system("pause"); return 0; }
6.初始化列表
class Person { public: ////传统方式初始化 //Person(int a, int b, int c) { // m_A = a; // m_B = b; // m_C = c; //} //初始化列表方式初始化 Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {} void PrintPerson() { cout << "mA:" << m_A << endl; cout << "mB:" << m_B << endl; cout << "mC:" << m_C << endl; } private: int m_A; int m_B; int m_C; }; int main() { Person p(1, 2, 3); p.PrintPerson(); system("pause"); return 0; }