xqn2017

导航

记录五20180606

1、类的成员函数和普通函数的区别?

普通函数属于全局函数,不受具体类和对象的限制,可以直接调用。

普通成员函数实质是一个包含指向具体对象this指针的普通函数,隐式包含一个指向当前对象的this指针。

C++中static修饰的静态数据成员是类的成员,而不是对象的成员。因此

1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数

2)不能将静态成员函数定义为虚函数。这是由于静态成员函数可以不同过对象来调用,也没有隐藏的this指针,而虚函数是实现多态的本质,是通过不同的对象来调用不同的功能实现多台,必然会通过对象去调用,也就不能定义为static了

2、static的作用?C++里的static的作用?

1)具有隐藏性,static修饰的全局变量、函数均在本.c文件中可以使用,其他.c文件不能使用

2)具有记忆性,static修饰的局部变量的值具有记忆性,下次调用时使用的是上次的值,而不是每次都被初始化。这是由于static修饰后,该局部变量就不存储在栈里,而是存在静态存储区

3、删除double类型的vector中所有与指定值(double类型)相等的元素,并统计个数

4、一个类class  A,如果定义A *p=NULL, p->fun(),调用成员函数,程序是否崩溃,可能出现什么情况?

这个问题其实就是是否理解this指针,举个简单的例子

#include <iostream>
using namespace std;

class CNullTest
{
public:
	void Test1();
	void Test2();
	void Test3(int temp);
	static void Test4();
private:
	int number;
	static int s_number;
};
int CNullTest::s_number = 0;

void CNullTest::Test1()
{
	cout << "It is Test1"<<endl;
}
void CNullTest::Test2()
{
	cout << number << endl;
}

void CNullTest::Test3(int temp)
{
	cout << temp << endl;
}

void CNullTest::Test4()
{
	cout << s_number << endl;
}

int main()
{
	CNullTest *p  = NULL;
	p->Test1(); //正确
	p->Test2(); //错误
	p->Test3(5); //正确
	p->Test4(); //正确

	getchar();
	return 0;
}

  上面的类定义了四个成员函数,其中的Test4()是静态成员函数,其他均为普通成员函数,同时定义了两个变量,一个是普通 成员变量number,另一个是静态成员变量s_number,那么当类指针p为空时,调用四个成员函数的结果如上注释,除了Test2()调用会错误,程序会崩溃外,其他三个均正常。解释如下:

Test1()函数:调用时仅仅是打印一个字符串,不涉及类里的变量,因此调用的时候仅仅是传入了this指针,但并没有用this指针去访问类的变量,不会出错

Test2()函数:调用传入this指针,并且,访问了类的变量,也就是相当于this->number,而因为p=NULL,因此this指针其实是空指针,必然错误

Test3()函数:同样传入了空的this指针,但并未使用,可以通过

Test4()函数:由于是静态成员函数,访问的是静态成员变量,因此,调用时并不会传入this指针,可以通过。

实际上,对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对象共用这个成员函数体。 当程序被编译之后,此成员函数地址即已确定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠这个this指针。函数体内所有对类数据成员的访问, 都会被转化为this->数据成员的方式。而一个对象的this指针并不是对象本身的一部分,不会影响sizeof(“对象”)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

5、虚函数什么时候使用会出现错误?

6、虚表是哪个阶段生成的?

虚函数表示在编译阶段就生成了,而虚函数指针的初始化则是在运行时才确定,这样才能实现多态

7、类中的成员函数是共享一份吗?不同实例的成员函数的内存地址是否一致?

8、更新一个功能需要修改代码吗?

 

posted on 2018-06-07 09:29  xqn2017  阅读(113)  评论(0编辑  收藏  举报