微信搜索:编程笔记本。获取更多干货。
点击上方蓝字关注我,我们一起学编程
欢迎小伙伴们分享、转载、私信、赞赏
马上就要秋招啦,再来一波 C++ 面题,多多益善~
目录
文章目录
-
-
- 目录
- 1.谈一谈 static 关键字
- 2. 谈一谈 C++ 和 C 的区别
- 3. 谈一谈 C++ 中四种 cast 转换
- 4. 为什么不建议使用 C 的强制转换
- 5. 谈一谈 C/C++ 中指针和引用的区别
- 6. 谈一谈 C++ 中的智能指针
- 7. 谈一谈析构函数和虚函数的关系
- 8. 谈一谈静态函数和虚函数的区别
- 9. 谈一谈重载和覆盖
- 10. 谈一谈你理解的虚函数和多态
- 11. 谈一谈 C++ 中是如何定义常量的,常量存放在内存的哪个位置
- 12. 使用 const 修饰成员函数的目的是什么
- 13. 谈一谈隐式类型转换
- 14. 谈一谈 C++ 函数栈空间的最大值
- 15. 谈一谈 new/delete 与 malloc/free 的区别是什么
- 16. 虚函数表具体是怎样实现运行时多态的?
- 17. C++ 是如何处理返回值的
- 18. C++ 中拷贝赋值函数的形参能否进行值传递
- 19. 谈一谈 map 和 set 有什么区别,分别是怎么实现的
- 20. 谈一谈 STL 的 allocaotr
- 21. 谈一谈如何用 STL 迭代器来删除元素的
- 22. vector 与 list 有哪些区别?
- 23. 迭代器的作用是什么?有了指针为什么还需要迭代器?
- 24. 谈一谈 STL 里 resize 和 reserve 的区别
- 25. C++ 类内可以定义引用数据成员吗?
- 26. 了解 C++ 源文件从文本到可执行文件经历的过程?
- 27. 谈一谈 include 头文件的顺序以及双引号””和尖括号<>的区别
- 28. 谈一谈 malloc 的原理,以及 brk 系统调用和 mmap 系统调用的作用分别是什么?
- 29. C++ 的内存管理是怎样的?
- 30. 谈一谈 C/C++ 的内存分配
- 31. 如何判断内存泄漏?
- 32. 什么时候会发生段错误?
- 33. 谈一谈 new 和 malloc 的区别
- 34. 如何采用单线程的方式处理高并发?
-
1.谈一谈 static 关键字
1.1 全局静态变量
在全局变量前加上关键字 static ,全局变量就定义成一个全局静态变量。
- 存储区:静态存储区
- 初始化:未经初始化的全局静态变量会被自动初始化为 0
- 作用域:从定义之处开始,到文件结尾。全局静态变量在声明他的文件之外是不可见的
- 生命周期:在整个程序运行期间一直存在
1.2 局部静态变量
在局部变量前加上关键字 static ,局部变量就定义成一个局部静态变量。
- 存储区:静态存储区
- 初始化:未经初始化的全局静态变量会被自动初始化为 0
- 作用域:局部作用域。当定义它的函数或者语句块结束的时候,作用域结束
- 生命周期:当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过不能再对它进行访问,直到再次进入该局部作用域时,可以访问并且值不变
1.3 静态函数
在函数返回类型前加上 static ,函数就定义为静态函数。
函数的定义和声明在默认情况下都是 extern 的,但静态函数只在声明它的文件当中可见,不能被其他文件所用,不会同其他文件中的同名函数引起冲突。
最佳实践:不要在头文件中声明 static 的全局函数,不要在 cpp 文件内声明非 static 的全局函数。如果要在多个 cpp 中复用某函数,就应该把它的声明提到头文件里去。
1.4 在类中使用 static
- 类的静态成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。
因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
对多个对象来说,静态数据成员只存储一处,但可供所有对象共用。
静态数据成员必须在类定义时就进行初始化,且必须用 const 关键字修饰。 - 类的静态函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是某个对象成员。
因此,对静态成员函数的引用不需要使用对象名。
在静态成员函数的实现中不能直接引用类中声明的非静态成员,可以引用类中声明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。
静态成员函数的调用格式为:<类名>::<静态成员函数名>(<参数表>)
示例代码:
#include <iostream>
using namespace std;
class A {
public:
A(int age) : m_age(age) {
}
int getNonstaticAge_ns() {
return m_age;
}
int getStaticAge_ns() {
return m_static_age;
}
/*
static int getNonstaticAge_s() {
return m_age;
}
*/
static int getStaticAge_s() {
return m_static_age;
}
private:
int m_age;
static const int m_static_age = 19;
};
int main() {
A a(18);
cout << a.getNonstaticAge_ns() << endl; // 正确:非静态成员函数能够访问非静态数据成员
cout << a.getStaticAge_ns() << endl; // 正确:非静态成员函数能够访问静态数据成员
//cout << a.getNonstaticAge_s() << endl; // 错误:静态成员函数不能够访问非静态数据成员
cout << a.getStaticAge_s() << endl; // 正确:静态成员函数能够访问静态数据成员
cout << A::getStaticAge_s() << endl; // 正确:静态成员函数能够访问静态数据成员
return 0;
}
/*
编译运行:
jincheng@haofan:~$ g++ test.cpp
jincheng@haofan:~$ ./a.out
18
19
19
19
jincheng@haofan:~$
*/
更多相关内容参见往期笔记:C++ 中的 const 用法。
2. 谈一谈 C++ 和 C 的区别
- 设计思想上:
C++ 是面向对象的语言,而 C 是面向过程的结构化编程语言 - 语法上:
C++ 具有封装、继承和多态三种特性。C++ 相比 C,增加多许多类型安全的功能,如强制类型转换;C++ 支持范式编程