1.有关类的定义
1.1类中的数据和函数是类的成员,分别称为数据成员和成员函数。
1.2类中关键字public、privata、protected声明了类中成员与类外(程序或其他部分)之间的关系,称为访问权限。
public:里面的成员是公有的,能被外面的程序访问。
private:里面的成员是私有的,不能被外面的程序访问,其中,数据成员只能由类中的函数所使用
成员函数只允许在本类中调用。
protected:里面的成员是受保护的,虽然不能在类外被访问,但可以在类中或其子类中访问。
notice:a.访问权限这三个关键字在类的定义时没有指定的顺序,而且可以在类中出现多次。每个访问权限关键词为类成员所指定的访问权限是从该关键词开始到下一个关键词为止。
b.若成员前面没有任何访问权限的指定,则所定义的成员是privata(私有)。
c.成员运算符“.”的优先级比取内容运算符“*”高,因此:(*<对象指针名>).<成员变量或成员函数>,对于对象的引用,和一般对象成员的访问形式相同。
d.在同一个类的作用域中,不管成员具有怎样的访问权限,都可在类作用域中使用,在类作用域外不可以使用。
e.创建完的对象只能访问public成员,private和protected均不能访问。
2.构造函数与析构函数
一个类总有两种特殊的成员函数:构造函数和析构函数。
构造函数:在创建对象时,使用给定的值讲对象初始化。
析构函数:当对象结束其生命周期是,用来释放内存等清理工作(主要释放栈中的内存),与构造函数的作用相反。
析构函数的调用情况:a.当对象定义在一个函数体中,该函数调用结束后(释放被调用函数时),析构函数被自动调用。
b.用new为对象分配动态内存后,当使用delete释放对象时,析构函数被自动调用(当然delete写在main 当中,在对象使用完后)。
notice:为了保证类的封装性,类中的指针成员所指向的内存空间必须在类中单独开辟和释放。
3.对象赋值和复制
3.1对象的赋值:如果对一个类定义了两个以上的对象,则对象之间的赋值(在没有重载的情况下)就是指对象中所有数据成员。
Student stu1,stu2;//定义两个Student类的对象
stu1 = stu2;//将stu2的数据成员赋值给stu1,当然这里的stu1和stu2都是默认构造
3.2对象的复制(copy):用一个已有的对象快速地复制出多个完全相同的对象。
Student stu1(stu2);
在建立对象时调用了一个特殊的构造函数:copy构造函数。
notice:
1.当类中数据成员有指针类型时,无论对象的赋值还是copy构造函数,都需要进行重载。因为对于指针对象,你要在类中单独开辟和释放。默认的赋值和复制就行不通了,默认的情况下编译器只会给你类中的指针类型的数据赋个NULL。
2.浅拷贝:拷贝指针变量的值深拷贝:拷贝指针所指向的内存空间
下面用代码解释上述的内容:
//.h中类的定义
class MyStr
{
public:
MyStr() { m_str = NULL; }//无参构造
MyStr(char *str,char * add) { ToSetStr(str,add); }//带参构造
MyStr( MyStr & str, char * add) { ToSetStr(str.m_str,add); }//拷贝构造
void ShowInfo() { cout << this->m_str << endl; }
void ReSetStr(char * str);
MyStr & GetStr(); //返回当前字符串的引用
~MyStr();
private:
char *m_str;
void ToSetStr(char * str, char *add);//这是私有函数就是构造一个str+add的字符串
};
//.cpp文件中有关带参构造,赋值语句的重载,copy构造等等
void MyStr::ReSetStr(char * str)
{
if (this->m_str) delete[]m_str;
m_str = NULL;
ToSetStr(str,NULL);
}
MyStr & MyStr::GetStr()
{
return *this;
}
MyStr::~MyStr()
{
if (m_str) delete[]m_str;
m_str = NULL;
}
//add是要在str上加上的字符
void MyStr::ToSetStr(char * str, char * add) //据说是copy构造
{
this->m_str = NULL;
if (str == NULL) return;//空指针,应该是输入的被复制的是个空指针
int size = strlen(str);
if (size < 1) return;//或者被复制的是个空字符串
int nadd = 0;
if (add)
nadd = strlen(add);
this->m_str = (char*) new char[size + 1 + nadd];
strcpy(m_str, str);
if (nadd > 0)
strcat(m_str, add);
}
//主函数的调用
int main(void)
{
char * str0 = "hello";
MyStr str1(str0,"you");
str1.ShowInfo();
MyStr str2 = str1.GetStr();
str2.ShowInfo();
getchar();
return 0;
}
结果: