您的位置:首页 > 编程语言 > C语言/C++

C++功在不舍(2012.07.06)

2012-07-06 18:35 169 查看
1.对为什么 类 中的成员函数的定义和声明不放在同一位置的理解?(为什么将成员函数的声明和定义分开?)

如果将class A的成员函数的声明和定义都写在类中,那么会默认地认为该成员函数为内联函数。

关于内联函数的解释,范磊老师的《从新手到高手C++全方位学习》一书中给出的定义是:(引号内内容摘自范磊老师的书中)

“当我们定义了一个函数之后,编译器就会在内存中为其创建一个指令集,当我们调用这个函数时,程序就会跳转到该指令集处。当程序运行完毕之后,程序又会返回到原来执行该调用语句的下一行继续执行。假如对该函数执行了上百次的调用,那么就要来回跳转上百次,这会严重影响程序的执行效率。”

结合,arm嵌入式的课程,我觉得应该类似于arm的中断机制:



2.不用void 和int float等开头的函数

构造函数和析构函数,与类有关。构造函数用来初始化对象。析构函数用来清除由构造函数创建的内存;当对象被销毁后清除它所占用的内存空间。

结合2的标题,构造函数和析构函数都不能有返回值。

3.成员指针运算符"->"(??应该??并不是之前自己理解的应用于所有的指针)

利用该符号,可以实现读取对象的内存地址并且访问该对象的成员的作用。

4.高效代码(C++的灵活之处)

{
int *p=new int(999);
cout<<*p<<endl;
delete p;
}
int *p=new int(999);定义指针,在堆中开辟内存空间,赋值一个语句就全都实现了。

5.编写类时容易遇到的问题

头文件中类的定义如下:

class A
{
public:
A();
~A();
int get()const{return *i;}
//the function of the assignment of *i
void set(int x){*i=x;}
private:
int *i;
};
值得注意的是,类的定义需要有分号来截止/终止。

.cpp文件中的函数如下:

A::A()
{
cout<<"构造函数执行中……"<<endl;
i=new int(1000);
}
A::~A()
{
cout<<"析构函数执行中……"<<endl;
delete i;
}
int main()
{
A *p=new A;
cout<<p->get()<<endl;
p->set(10);
cout<<p->get()<<endl;
delete p;
return 0;
}



有delete p和没delete p差别:

(1)有delete p:会执行析构函数;

删除p指针所指向的对象,同时调用了析构函数,析构函数有删除了成员指针i指向的内存大小为int型的内存空间.这样所有在堆中开辟的内存空间全部删除并收回。

(2)没有delete p:不执析构函数

这是因为堆中创建的对象没有被删除,相应的析构函数也没有被执行,i所指向的int型空间也没有被删除。???这是为什么啊???

如果换做在栈中创建对象:

A::A()
{
cout<<"构造函数执行中……"<<endl;
i=new int(1000);
}
A::~A()
{
cout<<"析构函数执行中……"<<endl;
delete i;
}
int main()
{
A a;//在栈中创建空间
cout<<a.get()<<endl;
a.set(10);
cout<<a.get()<<endl;
return 0;
}
执行了析构函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: