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、更新一个功能需要修改代码吗?