1.1类和对象
封装属性和行为作为整体
class typename{
admission://public,protected,private;
属性:
.......
行为函数:
......
};
int main(){
typename .... //实例化instantiate
}
1.2封装-权限:
公共权限: public:成员类内可以访问,类外也可以访问
保护权限: protected:成员类内可以访问,类外不可以访问,儿子可以访问父亲中的保护权限内容。
私有权限 : private:成员雷内可以访问,类外不可以访问,儿子不可以访问父亲中的私有权限内容。C++类内不声明,默认权限是私有
#includeusing namespace std; #define PI 3.14 class Person{ public: string name; protected : string car; private: int password; public: void init(){ name="ULL_64"; car="bigG"; password=124324; } }; signed main(){ Person p1; p1.init(); cout< 1.3利用public接口实现对私有权限内容得读写操作:
成员函数设置为私有的优点
1>可以自行控制读写权限;
2>对于写可以检测数据的有效性。
#includeusing namespace std; #define PI 3.14 class Person{ public : setname(string s){ name=s; } string getname(){ return name; } int getage(){ return age; } string getlover(){ return lover; } void setage(int x){ if(x<0||x>150) { cout<<"你这个老妖精!"< 1.4对象的初始化与清理:
构造函数与析构函数
构造函数的作用:初始化;
1.没有返回值不用写void
2.函数名与类名相同
3.构造函数可以有函数,可以发生重载
4.创建对象时,构造函数会自动调用一次。
析构函数:主要作用于对象被销毁前系统自动调用,执行一些清理工作。
1.没有返回值,不写void
2.函数名和类名相同,名称前加上~
3.析构函数不含参数,不可以发生重载
4.对象销毁前自动调用一次。
#includeusing namespace std; class Person{ public: Person(){ cout<<"构造函数的调用 "< 1.4.1构造函数的分类及其调用:
按参数:含参构造,无参构造。无参构造函数不要写括号,会被编译器认定为非类的函数。
拷贝构造函数和普通构造。
注意:匿名对象的特点,当前执行结束后就被系统释放
括号法构造
Person p1;
Person p2(10);
Person p3(p2);显示法构造:
Person p1
Person p2=Person(10)
Person p3=Person(p2);
注意:不要用拷贝函数初始化匿名对象。
隐式转化法
Person p1=10;
Person p2=p1;
拷贝构造的调用时机:
+ 使用一个已经创建完毕的对象来初始化一个新对象
+ 值传递的方式给函数参数传值
+ 以值的方式返回局部变量
构造函数调用规则:
1.1 编译器的默认构造函数
1.默认构造函数(无参空函数体)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数(对属性进行值拷贝)
1.2 注意事项
1.如果创建了有参构造函数,编译器就不再提供默认无参构造函数。
2.如果创建了拷贝构造函数,编译器就不再提供任何默认构造函数。
1.4.2 深拷贝与浅拷贝:
浅拷贝:简单的赋值拷贝参数,编译器进行逐个字节拷贝的是浅拷贝。
浅拷贝带来的问题是堆区的内存被重复释放
解决办法,重新写一个拷贝构造函数。
#includeusing namespace std; class Person{ public : int age; int *height; Person(){ cout<<"默认构造函数"< 如果属性有在堆区开辟的,一定要自己实现一个拷贝构造函数。避免程序崩溃。
深拷贝:在堆去申请空间,进行拷贝操作
1.5 初始化列表:
语法:构造函数()属性1(val1) 属性2(val2).......{}
类内定义Person(int a,int b,int c) : m_a(a),m_b(b),m_c(c){}
类外调用Person p(30,20,10);1.6类对象作为类成员
C++中类的成员可以是另一个类的对象,我们称该成员为类对象。
当其他的类的对象作为本类成员,先构造其他类的对象在构造本类成员。
析构是结论相反。
#includeusing namespace std; class Phone{ public: string phonename; Phone(string name){ cout<<"Phone 的构造函数"<



