cpp的类
访问的权限public/private/ptocted
public 任意用户都可以访问
private 私用的
protected 保护的数据类型
构造函数(各种类型的构造函数)
主要目的:
构造函数提供了对象参数初始化的方法
特点和其他语言类似。
有参数的构造函数必须同时声明成员对象,父类的构造函数
构造函数的顺序:
父类[按照声明顺序]
成员对象[按照声明顺序]
自己的构造函数
析构函数
没有返回参数和参数列表
不能重载
系统自动调用不能显示调用
应该是公有的
析构函数的顺序和初始化的顺序相反
复制构造函数
拷贝函数调用的情况:
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
3) 一个对象用于给另外一个对象进行初始化;
复制构造函数需要注意点
①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;
②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:
当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。
如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,
析构函数没有参数,也没有返回值,而且不能重载,在一个类中只能有一个析构函数。
需要注意重载运算符,下一章咱们说明
this指针
尽管在成员函数内部显式引用 this 通常是不必要的,但有一种情况下必须这样做:
当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。
不能从 const 成员函数返回指向类对象的普通引用。const 成员函数只能返回 *this 作为一个 const 引用。
sizeof用于类
可以计算类占用的空间
//
// main.cpp
// use_object_more
//
// Created by bikang on 16/10/21.
// Copyright (c) 2016年 bikang. All rights reserved.
//
#include <iostream>
#include "CrawFlag.h"
#include "FileCrawFlag.h"
using namespace std;
//设置坐标位置
class Point{
public:
Point(double x1,double y1){x=x1;y=y1;}
Point(){cout << "Point construct"<<endl;}
~Point(){cout << "Point destruct"<<endl;}
double getX(){ return x;}
double getY(){return y;}
void setX(double x1){x = x1;};
void setY(double y1){y = y1;}
private:
double x,y;
};
class SaMonthor{
public :
int age;
SaMonthor(int age1){age = age1;cout << "SaMonthor Construct"<<endl;}
SaMonthor(){cout << "SaMonthor Construct"<<endl;}
~SaMonthor(){cout << "SaMonthor Construct"<<endl;}
void showMonterData(){cout << "showData"<<endl;}
};
class SaFather{
public :
int age;
SaFather(int age1){age = age1;cout << "SaMonthor Construct"<<endl;}
SaFather(){cout << "SaFather Construct"<<endl;}
~SaFather(){cout << "SaFather Construct"<<endl;}
void showFathorData(){cout << "showData"<<endl;}
};
class Sa:SaFather,SaMonthor{
public :
Sa(string a1,int ageF,int ageM);
Sa(string a1);
Sa();
~Sa();
string getB();
void setB();
string a;
private:
string b;
Point p;
protected:
string c;
};
Sa::Sa(string a1,int ageF,int ageM):a(a1),SaFather(ageF),SaMonthor(ageF){
}
Sa::Sa(string a1):a(a1){
cout << "sa construct!" << endl;
}
Sa::Sa(){
cout << "sa construct!" << endl;
}
Sa::~Sa(){
cout << "sa destruct!" << endl;
}
class Sa2{
public:
Sa2(string a1)
{
a=a1;
b = new char[20];
strcpy(b, a.c_str());
cout << "sa2 construct"<<endl;
}
Sa2()
{
cout << "sa2 construct"<<endl;
}
Sa2(const Sa2 &r)
{
b = new char[20];
a = string(r.a)+"_new";
strcpy(b, a.c_str());
cout << "sa2 copy construct"<<endl;
};
~Sa2()
{
cout << "sa2 destruct"<<endl;
//delete b;
}
string a;
char *b;
};
//测试类
void tobject();
//测试拷贝构造函数
void tobjCopy();
void tobjCopy2(Sa2 s);
int main(int argc, const char * argv[]) {
cout << "start" << endl;
//tobject();
tobjCopy();
return 0;
}
void tobjCopy(){
Sa2 s1("copy data");
Sa2 s2 = s1;
cout << "b is:"<< s1.b<< "#"<<s2.b<<endl;
//tobjCopy2(s1);
}
void tobjCopy2(Sa2 s){
return;
}
void tobject(){
Sa s2("a");
}