C++必备基础知识和编程规范(2)

一般情况下不需要自定义拷贝构造函数(和析构函数一样没有为类中的成员开辟堆区内存),因为如果不定义拷贝函数编译器只会进行浅拷贝操作(只拷贝值,不拷贝内存空间),释放时会出现段错误

所以当类中有指针且为指针分配了空间时,要自定义拷贝构造函数进行深拷贝。

Stu(const Stu &s1)

{

id = s1.id;

name = new char[strlen(s1.name)+1];

strcpy(name, s1.name);

}

类中有动态内存分配时,需要自定义拷贝构造函数,否则会因为多次释放同一段内存导致段错误(double free or corruption)

14.const 修饰的成员函数

void setId(int num)const

{

}

称为只读成员函数,只能读取成员值,不能修改(除非是mutable int id)

15.对象数组:有限个相同类型的对象构成的集合

Stu array[3]={Stu(1), Stu(2)};

16.this指针

一个隐藏的指针变量,是成员函数的第一个参数,类型为对象的类型

如果对象的成员函数形参和属性相同,可用this指定

用于规范:

void setId(int id)

{

this->id = id;

}

如果要重复调用成员如:s1.setId(10).getId();可使setId()返回对象的引用(return *this)

17.枚举(常与switch使用)

构造函数列表

Stu():id(10), score(99.5)

{

}

使用方法和构造函数相同,但是可以完成特殊成员的初始化如const修饰的成员

18.const修饰的成员

只能用构造函数列表初始化,const修饰的成员在不同的对象中可以有不同的值

19.静态成员 static int num; static int getNum();

静态数据成员和静态成员函数,初始为0

静态数据成员在类外定义,类内声明,和类的其它成员不在一块内存,不占用对象的空间,sizeof()不会计算。

属于整个类而不是某个对象,可通过类名::对象访问Stu::num

作用之一:代替全局变量

静态成员函数不能使用非静态数据成员,只能访问静态数据成员和全局变量, 不能使用this

为了更好地操作使用静态数据成员而出现静态成员函数,在定义对象之前即可操作静态数据成员。

20.对象成员

即类的嵌套,类似结构体嵌套,一个类的对象作为另一个类的成员

给对象成员中的数据成员赋值要用构造函数列表

class A

{

public:

int aNum;

A(){

aNum = 1;

cout<<"在A构造函数中"<<endl;

}

A(int num){

aNum = num;

}

};

class B

{

public:

int bNum;

A a;

B()

{

bNum = 2;

cout<<"在B构造函数中"<<endl;

}

B(int num):a(10)

{

bNum = num;

}

};

21.友元

在类外访问类的私有成员 

友元函数,友元成员,友元类

关键字friend

友元函数:将一个类外函数声明为friend,可以访问类的私有成员,友元函数定义有顺序要求

友元成员:一个类的成员函数声明为friend如:friend void Tch::getNum(),另一个类的成员函数可以访问该类成员。

友元类:friend class Tch;

友元一般不使用,因为破坏了函数的封装性

22.运算符重载

也叫运算符重载函数,为适应对象操作

int operator +(A a1, A a2)

{

return a1.num+a2.num;

}

运算符重载实质为函数重载,必须遵循其原则

除了成员运算符".", "sizeof", 条件运算符"?:", 作用域运算符"::"之外都可以重载,重载后优先级和结合性不变

一般重载为友元函数或成员函数

单目运算符重载为成员函数,双目运算符重载为友元函数

"=", "()", "[]", "->"不能重载为友元

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/95c769edeb9e6abb4b0c5852070cdcde.html