准备C/C++面试需要深入研究语言基础知识,掌握控制流结构、函数、指针和标准库,同时准备好回答各种与C/C++编程相关的问题,这将有助于你在面试中脱颖而出。希望这些建议对你有所帮助,祝你面试顺利!
C++特点:
对象特点:
c的三大特点是:
继承中的三个修饰符:
与C语言区别:
(int)float_variable
在C++中,有四种类型转换操作符:static_cast<double>(float_variable)
6.1 malloc()与free ()是C语言的标准库函数,new/delete是C++的运算符,所以new/delete不 需要头文件进行声明; 6.2 new/delete可以调用构造函数和析构函数;
malloc
返回的是void *
(无类型指针)。需要手动将其转换为适当的类型
new
会调用构造函数来初始化对象(如果是自定义类的对象),而 malloc
不会执行构造函数。void *
是通用指针类型,被称为"无类型指针"。可以用来指向任何数据类型的内存地址。使用 void *
指针时需要谨慎,必须进行类型转换
示例(int 型转换):
int * intPtr=static_case<int *>(ptr);
因为不提供类型检查,可能导致运行时类型错误。
#include <iostream>
using namespace std;
int main()
{
int x = 42;
double y = 3.14;
char c = 'A';
void *ptr; // 声明一个无类型指针
ptr = &x; // 指向整数
//cout << *ptr << endl; //报错
int *intPtr = static_cast<int *>(ptr);//类型转换语句
cout << "*intPtr = "<<*intPtr << endl; // 42
ptr = &y; // 指向双精度浮点数
double *doublePtr = static_cast<double *>(ptr);
cout << "*doublePtr = "<<*doublePtr << endl; // 3.14
ptr = &c; // 指向字符
char *charPtr = static_cast<char *>(ptr);
cout << "*charPtr = "<<*charPtr << endl; // 'A'
}
换个问法:说说C++结构体和C结构体的区别
对于#include <a.h>,编译器从标准库路径开始搜索a.h 对于#include "a.h",编译器从用户的工作路径开始搜索a.h
有四个过程,预编译、编译、汇编、链接
实际的错误通常发生在链接阶段,当链接器尝试将所有编译单元(源文件)组合在一起时。如果在链接过程中找不到函数的定义,链接器会生成一个"未定义的引用"错误。
对于C语言的全局和静态变量,初始化发生在代码执行之前,属于编译期初始化。 对于C++:全局或静态对象对象首次用到时才进行构造。
区别:
内联函数的作用:提高程序的性能。
先看到实现代码:
int i = 5;
int a = i++; // a = 5, i = 6
int i = 5;
int b = ++i; // b = 6, i = 6
赋值顺序不同:++ i 是先加后赋值;i ++ 是先赋值后加;
查看链接:const与define详解
查看链接:虚函数实现多态详解
传参方式有这三种:值传递、引用传递、指针传递
值传递:形参即使在函数体内值发生变化,也不会影响实参的值;
void foo(int x) {
x = x * 2; // 修改的是副本,不会影响原始数据
}
引用传递:形参在函数体内值发生变化,会影响实参的值;
void bar(int &x) {
x = x * 2; // 修改原始数据
}
指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值;
void baz(int *x) {
*x = *x * 2; // 修改原始数据
}
默认构造函数:默认构造函数没有参数,它用于创建对象的默认初始化。如果你没有为类定义构造函数,并且没有提供初始化值,编译器会自动生成一个默认构造函数。
class MyClass {
public:
MyClass() {
// 默认构造函数
}
};
带参数的构造函数 :带参数的构造函数接受一个或多个参数,用于初始化对象的成员变量。
class MyClass {
public:
MyClass(int x, double y) {
// 带参数的构造函数
}
};
拷贝构造函数:拷贝构造函数用于在创建一个对象时,将另一个对象的值复制到新对象中。它通常以引用参数传递另一个对象。
class MyClass {
public:
MyClass(const MyClass& other) {
// 拷贝构造函数
}
};
它是单个参数的构造函数,其参数是与它同属一类的对象的(常)引用;类定义中,如果未提供自己的拷贝构造函数,C++提供一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员的拷贝,属于浅拷贝
浅拷贝(默认拷贝函数)︰将原对象或原数组的引用直接赋给新对象,新数组,新对象/新数组只是原对象的一个引用。 深拷贝∶创建一个新的对象和数组,将原对象的各项属性的"值”(数组的所有元素)拷贝过来,是“值",深拷贝会在堆内存Q中另外申请空间来储存数据,从而解决了指针悬挂问题。 注意:当数据成员中有指针时,必须要用深拷贝
左值是能够出现在表达式左边的值如变量,右值是只能出现在等号右边的值,如常量。
目的
template <typename T>
void wrapper(T&& arg) {
// 在这里使用 std::forward 来实现完美转发
some_function(std::forward<T>(arg));
}
void some_function(int& x) {
// 处理左值引用
}
void some_function(int&& x) {
// 处理右值引用
}
std::move
用于将左值强制转换为右值引用,然后原来的x变成空串。
示例中,source
最初指向”hello,world!“。使用 std::move
后,source
的内容被移动到了 destination
,而 source
变成了一个空字符串。
#include <iostream>
#include <string>
using namespace std;
int main() {
string x = "Hello, World!";
string y;
y = std::move(x);
cout << "x: " << x << endl; // 输出为空字符串
cout << "y: " << y << endl; // 输出"Hello, World!"
return 0;
}
strcpy 是标准C库函数,用于将一个字符串复制到另一个字符串中。然而它不检查源字符串的长度,可能会导致缓冲区溢出,引发安全漏洞。
需要逐个比较它们的成员变量(字段)
在继承关系中,子类(派生类)通常可以访问父类(基类)的以下成员变量和成员函数,具体访问权限取决于这些成员的访问控制修饰符: