7-19晚牛客网刷题未知点、错题 集合

1.

初始化为NULL(0)的类指针可以安全的调用不涉及类成员变量的类成员函数而不出错,但是如果类成员函数中调用了类成员变量则会出错

 

2.

悄咪咪加一个注意点:

注意enum在c语言中是关键字 ,c语言对大小写比较敏感,所以ENUM是一个标识符,但不是关键字。

 

3.

#include<iostream>

using namespace std;

class TestClass{

    char x;

public:

    TestClass() { cout << 'A'; }

    TestClass(char c) { cout << c; }

    ~TestClass() { cout << 'B'; }

};

int main() {

    TestClass p1, *p2;

    p2 = new TestClass('X');

    delete p2;

    return 0;

}

解析:

TestClass p1, *p2; //只为p1调用默认构造——A 

p2 = new TestClass('X'); //调用构造函数,由p2指向——X 

delete p2; //释放内存空间,p2所指实例调用析构函数——B 

return 0; //程序结束,p1调用析构——B

 

 

4,5 两个还是比较混乱的 正在研究中

4.

单选:

下列 C 代码中,不属于未定义行为的有:

A: int i=0;i=(i++);

B: char *p=”hello”;p[1]=’E’

C: char *p=”hello”;char ch=*p++

D: int i=0;printf(“%d%d\n”,i++,i--)

 

5.

下面代码的输出是什么?

class A  

{  

public:  

    A()  {     }  

    ~A() {    cout<<"~A"<<endl;   }  

};  

   

class B:public A  

{  

    public:  

        B(A &a):_a(a)  

        {  

             

        }  

        ~B()  

        {  

            cout<<"~B"<<endl;  

        }  

    private:  

        A _a;  

    };  

       

int main(void)  

 {  

        A a;       //很简单,定义a的时候调用了一次构造函数  

        B b(a); 

}

答案:

~B

~A

~A

~A

 

 

7.

假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。

CSomething a();

CSomething b(2);

CSomething c[3];

CSomething &ra = b;

CSomething d=b;

CSomething *pA = c;

CSomething *p = new CSomething(4);

 

解析:6个

CSomething a();// 没有创建对象,这里不是使用默认构造函数,而是定义了一个函数,在C++ Primer393页中有说明。

CSomething b(2);//使用一个参数的构造函数,创建了一个对象。

CSomething c[3];//使用无参构造函数,创建了3个对象。

CSomething &ra=b;//ra引用b,没有创建新对象。

CSomething d=b;//使用拷贝构造函数,创建了一个新的对象d。

CSomething *pA = c;//创建指针,指向对象c,没有构造新对象。

CSomething *p = new CSomething(4);//新建一个对象。

 

8.

假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是____。

8

解析:

逗号表达式的求值顺序是从左向右依次计算用逗号分隔的各表达式的值,最

后一个表达式的值就是整个逗号表达式的值。所以表达式最后的值是a+b,但经过前面的

计算,此时a的值为2,b的值是6,所以最后的结果是8,应选择B。

 

9.

下面这个代码输出的是()

#include <iostream>       

#include <vector>

using namespace std;

int main(void)

{

    vector<int>array;

    array.push_back(100);

    array.push_back(300);

    array.push_back(300);

    array.push_back(300);

    array.push_back(300);

    array.push_back(500);

    vector<int>::iterator itor;

    for(itor=array.begin();itor!=array.end();itor++)

    {

        if(*itor==300)

        {

            itor=array.erase(itor);

        }

    }

    for(itor=array.begin();itor!=array.end();itor++)

    {

            cout<<*itor<<"";

    }

  return 0;

}

 

100 300 300 500

解析:

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 
vector::erase()方法有两种重载形式 
如下: 
iterator erase(   iterator _Where); 
iterator erase(   iterator _First,   iterator _Last); 


如果是删除指定位置的元素时: 
返回值是一个迭代器,指向删除元素下一个元素; 

如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

 

在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),

                            在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环

         进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。

所有整个过程中,只删除了2个值为300的元素。

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38313246/article/details/81122202
今日推荐