|
发表于 2024-12-6 17:38:24
|
查看: 102 |
回复: 0
来自:碧波
一、C++语法基础
5. 指针和引用的区别
引用不能指向空值(null),而指针可以。
引用在使用时不需要解引用操作(不需要 * 符号),而指针需要。
引用在定义时必须初始化,而指针可以在后续指向不同的对象。
6. 什么是函数指针和指针函数以及区别
函数指针 是指 指向一个函数的指针变量。它可以指向一个特定类型和签名(参数类型和返回类型)的函数。函数指针的声明形式类似于指向其他类型的指针,但其类型是指向函数的指针类型。
// 声明一个函数指针类型
typedef void (*FuncPtr)(int); // FuncPtr 是一个指向返回类型为 void,参数为 int 的函数指针类型
// 定义一个函数
void myFunction(int x) {
// 函数体
}
int main() {
// 声明一个函数指针变量并初始化
FuncPtr ptr = &myFunction;
// 通过函数指针调用函数
ptr(10); // 相当于调用 myFunction(10);
return 0;
}
指针函数 指的是 返回类型 为 指向函数的指针 的函数。换句话说,指针函数是一个返回类型为函数指针的函数。
// 声明一个指针函数
int (*funcPtr)(int, int); // funcPtr 是一个函数,返回类型为 int*,参数为两个 int
// 定义一个函数
int add(int a, int b) {
return a + b;
}
// 另一个函数,返回一个函数指针
int (*getAddFunctionPointer())(int, int) {
return &add;
}
int main() {
// 获取 add 函数的函数指针
funcPtr = getAddFunctionPointer();
// 通过函数指针调用函数
int result = funcPtr(3, 4); // 相当于调用 add(3, 4),result 等于 7
return 0;
}
区别
函数指针是指指向函数的指针变量,而指针函数是一个返回类型为函数指针的函数。
函数指针在声明时需要指定其指向的函数的签名(参数类型和返回类型),而指针函数的返回类型是一个函数指针类型。
函数指针直接指向一个已存在的函数,可以通过该指针调用该函数;而指针函数返回一个函数指针,需要通过该函数指针再调用相应的函数。
(顺手推个岗位,技术大厂,前后端测试捞人,近三周条件放宽>>>机会)
7. 什么是常量指针和指针常量以及区别
常量指针: 指的是指针本身的值(即指向的地址)可以改变,但指针指向的对象的值不能通过这个指针进行修改。
int x = 10;
int* const ptr = &x; // ptr 是一个常量指针,指向 int 类型的对象
// 无法再修改 ptr 指向的对象,但可以修改对象本身的值
*ptr = 20; // 合法,修改了 x 的值为 20
// 以下操作不合法,因为 ptr 是常量指针,不能改变指向
// ptr = &y; // 错误,无法改变 ptr 的指向
指针常量:指的是指针本身的值(即指向的地址)不能改变,但可以通过这个指针修改指向对象的值
int x = 10;
const int* ptr = &x; // ptr 是一个指向常量 int 的指针
// 以下操作合法,可以修改 ptr 所指向对象的值
x = 20; // 修改了 x 的值为 20
// 以下操作不合法,因为 ptr 所指向的对象是常量,不能修改其值
// *ptr = 30; // 错误,不能通过 ptr 修改其指向的对象的值
// 以下操作合法,因为 ptr 本身不是常量,可以改变其指向
int y = 50;
ptr = &y; // 合法,修改了 ptr 的指向为变量 y
// 另一种写法 * 解引用,也是取值。
int const * p;
区别
常量指针 强调指针本身是常量,指向对象的值可以改变;
指针常量 强调指针所指向的对象是常量,指针的指向可以改变
简单记忆:
距const 修饰右边最近的值是常量 ,不能被修改。
8. 智能指针的本质是什么以及实现原理
智能指针是一种用于管理动态分配内存和自动释放资源的工具,其本质是利用了 RAII(资源获取即初始化)的设计模式。即在对象初始化的时候获取资源(比如动态分配的内存),在对象析构的时候自动释放资源。
它提供了一个封装了指针的对象,通过其析构函数来确保在对象生命周期结束时,所管理的资源能够被正确释放,避免内存泄漏和资源泄漏。
实现原理:
智能指针实现是引入计数引用机制。智能指针对象本身持有一个指向动态分配资源的指针,并维护一个引用计数。每当有一个新的智能指针指向同一块内存时,引用计数增加;当智能指针超出作用域或被显式销毁时,引用计数减少。当引用计数为零时,智能指针负责释放其管理的资源。
常见的智能指针类型:
std::shared_ptr:允许多个指针共享同一块资源,通过引用计数来管理资源的生命周期,适用于多个所有者的情况。
std::unique_ptr:独占所指向的对象,保证在任何时刻只有一个指针可以指向该对象,移动语义保证资源的所有权可以传递但不共享。
std::weak_ptr:用于协助 std::shared_ptr,不会增加引用计数,避免循环引用问题,通常用于解决 shared_ptr 的环状引用问题。
智能指针通过结合 RAII 设计模式和引用计数技术,提供了一种高效、安全、方便的动态内存管理机制,是现代 C++ 开发中推荐使用的重要工具之一。
9. weak_ptr 是否有计数方式,在那分配空间?
std::weak_ptr 是一种观测型智能指针,用于解决 std::shared_ptr 的循环引用问题,它本身并不进行内存空间分配或引用计数,而是依赖于 std::shared_ptr 来管理资源的生命周期。
std::weak_ptr 可以通过 std::lock() 成员函数获取一个 std::shared_ptr。
调用 std::lock() 成员函数可以获取一个 std::shared_ptr 对象,该对象指向 std::weak_ptr 所观测的对象(如果它仍然存在)。
如果 std::weak_ptr 过期(即其管理的对象已经被释放),std::lock() 返回一个空的 std::shared_ptr。
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> shared = std::make_shared<int>(42);
std::weak_ptr<int> weak = shared;
// 使用 std::lock() 获取 std::shared_ptr
std::shared_ptr<int> locked = weak.lock();
if (locked) {
// 如果成功获取到 std::shared_ptr,则可以安全地使用它
std::cout << "Value pointed by shared_ptr: " << *locked << std::endl;
} else {
std::cout << "The shared_ptr is no longer available." << std::endl;
}
// 在此之后,shared_ptr 可能会超出作用域,对象被销毁
return 0;
}
10. 类型强制转换有哪几种?
有四种类型转换方式,它们分别是:
静态转换(static_cast)
常量转换(const_cast)
动态转换(dynamic_cast)
重新解释转换(reinterpret_cast)
|
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【 投诉建议】板块发帖举报。
|