#include <iostream>
using namespace std;
#include <string> //c++ 中调用string类型 字符串时需要加,否则编译会报错-----包含一个头文件
#include <ctime>//使用时间头文件
//不提供构造函数和析构函数也可以,编译器默认有空的函数。
//构造函数 --- 初始化函数,编译器自动调用,只调用一次,函数名同类名可以有参数(同函数的重载),没有返回值,不用写返回值类型
//析构函数 --- 清理,编译器自动调用,只调用一次,函数名同类名,前边加~, 不能有参数,函数(对象)执行完才会调用析构函数
//默认有 Person(){}; ~Person(){};
class Person
{
public:
Person()//构造函数--默认函数
{
cout << "我是默认构造个人" << endl;
}
Person(int a)//构造函数
{
cout << "我是有参构造的人" << endl;
}
Person(const Person &p)//拷贝函数
{
name=p.name;
sex = p.sex;
age = p.age;
height = p.height;
weight = p.weight;
cout << "我是拷贝构造的人" << endl;
}
~Person() {//析构函数---程序执行完时候,会清理
cout << "我休息了" << endl;
}
private:
string name;
string sex;
int age;
int height;
int weight;
};
void test() {
Person P;//栈上的数据,test执行完后调用析构函数
}
void docc(Person p) {
}
void ccc() {
Person p;
docc(p);
//先调用 默认构造函数,然后调用拷贝函数(传参时候复制一个空间)
}
Person c1() {
Person p;
return p;
}
Person c2() {
Person p = c1();
return p;
}
//静态成员对象 在类内声明,类外初始化
class Per {
public:
//静态成员函数智能访问静态成员----访问权限(定义在私有区时,外部不能访问)
static void f(int a, int b) {
cc = a;
//dd = b;//dd为非静态成员,不能再惊天函数中调用
}
Per& ff(Per &P) {
this->dd += P.dd;
return *this;
}
Per ffs(Per &P) {
this->dd += P.dd;
return *this;
}
static int cc;
int dd;
};
int Per::cc = 2;
class jia {
friend void goodGay(jia &j);//友元-》全局函数作为友元后,全局函数可以访问私有属性
friend class canguan;//类作为友元
public:
//jia() {
// kt = "客厅";
// ws = "卧室";
//};
jia();//类外写函数
public:
string kt;//客厅
private:
string ws;//卧室
};
class canguan{
public:
canguan();
void visit();//访问 jia 中的 私有属性
jia *j;
};
jia::jia() {
kt = "客厅1";
ws = "卧室1";
}
canguan::canguan() {
j = new jia;
}
void canguan::visit() {
cout << j->kt << endl;
cout << j->ws << endl;//由canguan 类 访问 jia类中私有属性,在jia类中设置canguan类为友元,即可访问
}
void goodGay(jia &j) {
cout << j.kt << endl;
cout << j.ws << endl;//ws为私有属性 类中没有做友元 则报错
}
void cjj() {
jia j;
goodGay(j);
}
//int main() {
//test();//调用构造和析构()
//调用默认函数时候不要加(),会被系统认为是一个函数声明 如 Person p();
//Person p;
//system("pause");//有此行时,上一行得再按一次任意键,程序才会执行完,然后调用析构函数
//Person p2=Person(10);
//Person(10);//称为匿名对象,在当前行执行完毕后,释放
//Person(p2);//不要用匿名对象调用拷贝函数,系统默认为 如 ; Person p2=Person(p2); 相当于把p2 重定义了
//隐式转换法
//Person p3 = 10;//相当于 Person p3=Person(10);
//c2();
//Per(p1);
//p1.dd = 10;
//Per(p2);
//p2.dd = 12;
//链式编程思想
//p2.ff(p1).ff(p1).ff(p1);//---返回42;
//p2.dd = 12;
//p2.ffs(p1).ffs(p1).ffs(p1);//---返回22,每一次调用ffs 返回一个新的对象,dd再成12,
//cout << p2.dd << endl;
//canguan c1;
//c1.visit();
//}