zoukankan      html  css  js  c++  java
  • 记录五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、更新一个功能需要修改代码吗?

  • 相关阅读:
    数据查询表,列名对比
    Oracle ORA06550:错误
    设计模式——单例模式
    MS SQL 建表SQL的脚本
    WinForm 清空界面控件值的小技巧
    WinForm系列——控件的输入限制
    C++学习笔记——常量定义
    PLSQL 调试触发器
    static类为什么不能用sealed关键字修饰
    C++虚函数解析(转)
  • 原文地址:https://www.cnblogs.com/xqn2017/p/9148984.html
Copyright © 2011-2022 走看看