首页技术文章正文

C++易犯错知识点(二)

更新时间:2018-01-23 来源:黑马程序员 浏览量:

16、要想共享初始化的过程,可以先定义一个共享成员函数,然后每个构造函数都调用之。

17、C++提供的默认构造函数是个无参构造函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数,C++就不再提供默认的构造函数。(如果此时还想要无参构造函数,则需要自己定义)与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则对象值是随机的。

创建对象的唯一途径是调用构造函数。

静态对象只被构造一次,所有全局对象都在主函数main()之前被构造。

18、面向对象程序设计主要是两方面:面向对象应用程序设计,类库的设计。面向对象程序设计的关键是如何抽象和分类。

19、全局变量、静态变量、常量存放在全局数据区,所有类成员函数和非类成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间都被作为堆区。

void* malloc(size_t);和void free(void*);在头文件malloc.h中声明。而操作符new和delete是C++的一部分,无须包含头文件,它们都是从堆中分配和释放内存块,但是具体操作上两者有很大的区别。

操作堆内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄露,这与函数中栈区分配局部变量有本质的区别。

从C++来说,不使用malloc()函数一个原因是,它在分配空间的时候不能调用构造函数。类对象的建立是分配空间,构造结构及初始化的三位一体,它们统一由构造函数来完成。而new和delete在创建对象和删除对象时,便同时调用构造函数和析构函数。

定义对象数组,在生成对象时,依次调用构造函数(如依次生成ps[0],ps[1],ps[2]......),由于分配数组时,new的格式是类型后面跟[元素个数](student* ps=new student[10]),不能再跟构造函数参数,所以从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数,如果该类没有默认的构造函数,则分配对象数组失败。Delete[] ps告诉C++将要该指针指向的是一个数组,如果在[]中填上了长度信息,C++将忽略。

20、拷贝构造函数

当构造函数的参数为自身类的引用时,这个构造函数称为拷贝构造函数。拷贝构造函数的功能是用一个已有对象初始化一个正在建立的同类对象。

拷贝构造函数定义形式如下:

Student(student& s)

27、C++基础笔记(一) - EdwardLewis - 墨涵天地

Person p1;

p2=p1;

27、C++基础笔记(一) - EdwardLewis - 墨涵天地

27、C++基础笔记(一) - EdwardLewis - 墨涵天地

在创建对象p2时,对象p1被复制给了p2,同时资源也作了复制,此时p1和p2指向不同的资源,这称为深拷贝。

27、C++基础笔记(一) - EdwardLewis - 墨涵天地

如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。C++提供的默认函数只是对对象进行浅拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,要自己定义拷贝构造函数,为创建的对象分配堆空间。

21、静态成员

这种属于类的一部分,但既不适用于普通成员函数,也不适用于全局变量表示的数据,我们用静态成员来表示。

一般情况下,我们在类的内部实现中对静态数据成员进行定义(在类的内部实现中分配空间和初始化)。

Int student::noOfstudent=0;

静态数据成员一般用于:

标志一个事件的发生与否,某个特定的指针,变化的对象等。

静态成员函数定义是类的内部实现,属于类的一部分,定义位置同一般成员函数。与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象。如果用对象去引用静态成员函数,只是用其类型。

#include

using namespace std;

class Student

{

public:

static int number()

{

return noOfStudents;

}

protected:

char name[40];

static int noOfStudents;

};

int Student::noOfStudents=1;

int main()

{

Student s;

cout<<s.number()<<endl;< p="">

cout<<student::number()<<endl;< p="">

return 1;

}

一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。静态成员函数与非静态成员函数的根本区别是静态成员函数没有this指针。 这也就是静态成员函数与当前对象无联系的原因。

*********************************

class Sc

{

public:

void nsfn(int a);//类同声明成Sc::nsfn(Sc* this,int a)

static void sfn(int a); //无this指针

//...

};

void f(Sc& s)

{

s.nsfn(10); //C++编译成Sc::nsfn(&s,10)

s.sfn(10); //C++编译成Sc::sfn(10)

}

静态的static一词与静态存储类的static是两个概念,一个论及类,一个论及内存空间的位置及作用域,所限定以要区分静态对象和静态成员。


本文版权归黑马程序员C/C++学院所有,欢迎转载,转载请注明作者出处。谢谢!


作者:黑马程序员C/C++培训学院


首发:http://c.itheima.com/


分享到:
在线咨询 我要报名
和我们在线交谈!