c++基础面试
1、构造析构顺序。
#include<iostream>
#include<vector>
using namespace std;
class A {
public:
A() {
cout << "A is created" << endl;
Print();
}
~A() {
cout << "A is deleted" << endl;
}
virtual void Print() {
cout << "A::Print called" << endl;
}
};
class B : public A {
public:
B() {
cout << "B is created" << endl;
Print();
}
~B() {
cout << "B is deleted" << endl;
}
virtual void Print() {
cout << "B:: Print called" << endl;
}
};
int main() {
A* pA = new B();
delete pA;
return 0;
}
# 执行结果:先执行A的构造,和A构造内部的函数,再执行B的构造函数,和B构造内部的函数,
delete pA这个指针,只会执行A的析构函数,怎么改?
把A的析构函数搞成虚函数。
A is created
A::Print called
B is created
B:: Print called
A is deleted
2、
#include<iostream>
#include<vector>
using namespace std;
class A {
private:
int m_value;
public:
A(int value) {
m_value = value;
}
void Print1() {
printf("hello world ,print1");
}
virtual void Print2() {
printf("hello world ,print2");
}
void Print3() {
printf("%d", m_value);
}
};
int main() {
A* pA = NULL; // 错误
pA->Print1();
pA->Print2();
pA->Print3();
return 0;
}
//
g++ 222.cpp -std=c++11
txdy827@gpulab-k40:~/Desktop$ ./a.out
Segmentation fault (core dumped)
3、列表初始化
#include<iostream>
#include<vector>
using namespace std;
class A {
private:
int n1;
int n2;
public:
//A():n2(0),n1(n2+2){ } // n1 is -858993458 n2 is 0
A() :n1(0), n2(n1 + 2) { } // n1 is 0 n2 is 2 ,按顺序可以使用,但是一般都会出问题。
void Print1() {
cout << "n1 is " << n1 << " n2 is " << n2 << endl;
}
};
int main() {
A a;
a.Print1();
return 0;
}
4、sizeof c语言中的
#include<string.h>
#include<stdio.h>
int SizeOf(char pString[]){
return sizeof(pString);
}
int main() {
char * pString1 = "BONC_TEST";
int c = sizeof('c');
printf("sizeof(c) is %d\n",c);
int size1 = sizeof(pString1);
int size2 = sizeof(*pString1);
char pString2[100] = "BONC_TEST";
int pString3[100] = {100};
int size3 = sizeof(pString3); // 400 = 100 X 4
int size5 = sizeof(pString2); // 100 = 100 X 1
int size4 = SizeOf(pString2);
printf("%d,%d,%d,%d,%d\n", size1, size2, size3, size4,size5);
return 0;
}
// 输出,
sizeof(c) is 4
8,1,400,8
如果sizeof()后面加数组,那就直接相乘,数组个数 X 数组元素所占字节