c++
Alen.Wang
智能机器人硕士,擅长复杂电路设计、嵌入式软件编程及系统架构设计,从事嵌入式AI开发工作,有多年项目开发经验。
我的联系邮箱 alen_wp@163.com
展开
-
c++构造函数是 protected 属性,如何实例化
请注意,上述方法都是通过绕过 protected 访问控制来实例化对象。在使用这些方法时,需要谨慎考虑设计和安全性,确保只在必要的情况下使用。1. 在派生类中实例化:由于派生类可以访问基类的 protected 成员,因此可以在派生类的构造函数中调用基类的构造函数来创建对象。2. 使用工厂函数:可以在类的友元或其他类中编写静态工厂函数,该函数可以访问受保护的构造函数并返回类的实例。原创 2023-07-19 15:10:28 · 560 阅读 · 0 评论 -
c++类里有纯虚函数,那么这个类就不能实例化
抽象类的主要目的是作为其他类的基类,为派生类提供接口和规范,并强制要求派生类实现特定的功能。因此,抽象类只能作为基类来使用,提供一种抽象的概念。抽象类不能直接实例化(即不能创建抽象类的对象),因为它们存在未实现的纯虚函数。纯虚函数是在基类中声明的没有具体实现的虚函数,通过将其赋值为0来定义。总结来说,包含纯虚函数的类(抽象类)不能直接实例化,但可以被作为基类,通过派生类来实现和使用。需要注意的是,在派生类中,必须实现基类中的所有纯虚函数,否则派生类仍然会被视为抽象类。原创 2023-07-19 14:52:11 · 925 阅读 · 0 评论 -
c++ lamda表达式
Lambda表达式在现代C++编程中非常常用,它能够简化代码、提高可读性,并且可以与标准库中的算法和容器等一起使用。您可以根据具体的需求来灵活地使用Lambda表达式。C++ Lambda表达式是C++11引入的一种函数对象,它提供了一种方便、灵活的方式来定义匿名函数。Lambda表达式常用于函数式编程风格和STL算法中。:捕获列表,用于指定外部变量的访问方式。:返回类型,指定Lambda表达式的返回类型。:函数体,指定Lambda表达式的执行逻辑。:参数列表,指定Lambda表达式的参数。原创 2023-06-30 15:34:07 · 302 阅读 · 0 评论 -
派生类赋值给基类(向上转型)
需要注意的是,基类对象只能访问派生类中基类部分的成员函数和成员变量,无法访问派生类独有的成员。如果需要访问派生类独有的成员函数或成员变量,需要进行向下转型(downcasting)操作,并确保类型的安全性。在面向对象编程中,派生类是基类的扩展或特化。通过继承关系,派生类会继承基类的属性和方法,并且可以额外定义自己的属性和方法。在C++中,可以使用指针或引用将派生类赋值给基类类型的变量。这样做是为了保持类型兼容性和语法的一致性。原创 2023-06-25 13:44:49 · 318 阅读 · 0 评论 -
C++友元函数和友元类
在 C++ 中,我们可以通过使用friend关键字来将一个函数或类声明为另一个类的友元,从而获得访问该类中私有成员的权限。原创 2023-06-21 16:12:25 · 337 阅读 · 0 评论 -
std::is_same<T, int>::value 含义
它的返回值是一个布尔类型的常量表达式,在模板实例化时就已经确定了,它可以被用作条件编译或者对类型进行选择性编译。头文件中,提供了在编译期间对 C++ 类型进行查询和转换的功能。,它使用更为简便,可以在 C++17 及以后的版本中使用。是 C++11 引入的类型特征之一,它们都定义在。是一个 C++ 模板元编程中的类型特征,在这个代码示例中,如果调用。函数时传递的参数类型是。原创 2023-06-21 15:03:53 · 308 阅读 · 0 评论 -
使用std::function 来实现回调函数、委托的功能
在C#语言中,委托(Delagate)可以看做函数指针的更高级抽象,它允许方法的选择器(Selector)与特定类型安全签名相匹配的方法进行关联,从而实现动态调用、反射、事件等功能。来实现委托,我们可以将不同的函数作为可选项传递给一个类的方法,从而实现动态选项。当然,这只是一个简单的示例,实际上委托可以实现更复杂的功能,例如事件、反射等。在函数的实现中,我们打印出一条简单的消息,然后调用传递进来的回调函数,并传递给它文本参数。,这个函数接受一个字符型指针参数,并打印出这个字符串。函数,并输出计算结果。原创 2023-06-20 14:26:14 · 1013 阅读 · 0 评论 -
c++ std::function的使用
是 C++11 引入的一个非常有用的函数对象封装类,它可以存储和调用各种类型的可调用对象,包括函数指针、函数对象、成员函数指针、Lambda表达式等等。当我们需要将一些可调用对象存储在一个容器中,或者将它们作为其他函数的参数时,,然后使用函数指针、Lambda表达式和成员函数指针分别初始化了三个。来进行引用封装,以确保被封装的对象可以在 调用时访问。注意到,函数指针和成员函数指针需要使用。在上述示例中,我们分别定义了一个普通函数。还可以用来实现回调函数、委托等功能。、一个有返回值的函数。原创 2023-06-20 14:21:36 · 476 阅读 · 0 评论 -
c++11 自定义线程类实现线程的启动、暂停与停止
【代码】c++11 自定义线程类实现线程的启动、暂停与停止。原创 2023-06-19 14:19:21 · 1001 阅读 · 1 评论 -
c++自定义线程类实现线程的启动与停止
的线程类,其中包含了启动线程、停止线程、运行线程等方法。在启动线程时,我们获取了一个互斥锁来保障线程安全,只有在线程没有运行时才启动线程。在停止线程时,也要获取互斥锁来保障线程安全,并且在线程运行时才进行停止操作。,也可以自定义一个线程类来管理线程的生命周期。来表示线程执行的代码,这个函数需要在自定义的子类中实现。例如,在上述代码中我们定义了一个名为。这样可以保证线程在被销毁之前一定会被停止,避免了程序崩溃等问题。对象时,我们通过判断线程是否正在运行来决定是否调用。在上述代码中,我们定义了一个名为。原创 2023-06-16 10:42:23 · 536 阅读 · 0 评论 -
c++初始化vector的几种方法
需要注意的是,在初始化vector时提供的初始值,需要与vector模板参数类型匹配或者能够隐式转换为vector模板参数类型。如果提供的初始值数量超过了vector预留的存储空间,则vector会自动分配更大的存储空间以容纳所有元素。使用复制或移动构造函数可以从一个已存在的vector创建新的vector。此方式将会创建一个包含3个int类型元素,值分别为1、2、3的vector。此方式将会创建一个包含8个未初始化int类型元素的vector。此方式将会创建包含5个值为0的int类型元素的vector。原创 2023-06-15 17:29:30 · 7987 阅读 · 0 评论 -
c++11 final, override,const 成员函数
这一特性使得一些成员变量可以在逻辑上保持不变,同时又能够在。3). const 成员函数增强:C++11 中,当成员函数带有。在 C++11 中,引入了一些新的特性,包括。关键字来标记其中某些成员变量为可变的。关键字和 const 成员函数的增强。进行重载或覆盖,否则会产生编译错误。函数中被更新,提高了代码的灵活性。关键字,这意味着它必须覆盖基类。关键字修饰,但是其中的变量。关键字修饰,表示它可以在。关键字:override。在上述代码中,派生类。原创 2023-06-15 08:56:55 · 603 阅读 · 0 评论 -
std::unique_lock的使用
是 C++11 中的一个互斥量封装类,用于提供更灵活和安全的互斥访问。可以随时释放互斥锁,并且支持对互斥量进行延迟加锁和递归加锁。对象被销毁时(例如离开函数作用域),它会自动释放对。例如,下面是一个示例程序,展示了如何使用。延迟加锁,然后在循环内部使用了显式的。的锁定,从而避免了忘记释放锁的问题。对象,然后将其传递给。原创 2023-06-14 14:51:27 · 3144 阅读 · 0 评论 -
c++11 线程同步与互斥如何使用
当一个线程需要访问共享资源时,它必须首先获取互斥量的锁,以确保其他线程无法同时访问该资源。当该线程完成它的工作后,必须释放互斥量的锁,以允许其他线程访问该共享资源。当多个线程需要访问同一共享资源时,需要采用互斥量来保证在任一时刻只有一个线程能访问该资源,从而防止数据竞争和内存泄漏的问题。原子操作主要用于保证对特定数据类型的操作在多线程环境下是原子性的,即不会被中断。在 C++11 中,线程同步和互斥可以使用互斥量、条件变量以及原子操作来实现。来通知等待条件变量的线程开始执行。变量被用作互斥量和条件变量,原创 2023-06-14 14:23:38 · 1623 阅读 · 0 评论 -
c++ 线程如何使用
在 C++11 之前,C++ 标准库没有提供原生的线程支持,需要调用操作系统提供的 API 来实现多线程程序。而从 C++11 开始,C++ 标准库增加了对多线程的支持,包括语言层面的线程库和同步原语。在单个程序中并发创建过多的线程可能会导致性能下降,建议根据计算机的硬件和资源情况来合理地控制线程数量。由于多线程访问同一块内存可能会导致竞态条件,需要通过使用原子类型或者其他同步原语来防止这种情况的发生。线程间的数据共享问题需要通过同步原语(如互斥锁、条件变量等)来解决,否则程序会产生不可预期的结果。原创 2023-06-14 14:07:42 · 1388 阅读 · 0 评论 -
c++ make_shared的使用及注意事项
在 C++11 中,可以使用 make_shared 函数来创建共享指针,它是一个模板函数,可以接受任何类型的参数,并返回一个指向该类型对象的共享指针。它可以将控制块和对象一起分配在堆上,从而避免了两次内存分配,并减少了引用计数的内存开销,相对于直接使用。其中,T 表示指向的类型,Args 是类型 T 的构造函数所需的参数列表,在调用时需要传递给构造函数。是 C++11 提供的一种高效、安全的智能指针工厂函数,使用起来方便且实用。来创建一个较大的对象,可能会增加堆分配的消耗。在上面的代码中,我们使用。原创 2023-06-14 13:24:24 · 16180 阅读 · 1 评论 -
c++模板函数的使用
需要注意的是,在使用模板函数时,要确保提供的类型支持所需的操作。例如,对于上述示例中的模板函数,参数类型必须支持 ">" 运算符,才能够进行比较操作。总之,C++ 模板函数是一种强大的工具,可以大大提高代码的重用性和可维护性,通过以上步骤,我们可以轻松地在程序中使用模板函数来处理不同类型的数据。编译器会自动根据传入的参数类型来实例化模板函数,并生成相应的代码来进行处理。如果不指定类型参数,则编译器会根据传入的参数类型自动推断出类型参数的类型。在调用模板函数时,我们使用尖括号指定类型参数的值。原创 2023-06-14 12:55:37 · 595 阅读 · 0 评论 -
c++模板类
上面的代码展示了一个模板类 MyVector,它可以表示包含不同类型元素的向量。在类的定义中,我们使用关键字 template 和一个类型参数 T 来指示该类是一个模板类。在创建类的实例时,我们需要将具体类型 (如 int 或 double ) 传递给模板类,以便将其用于实例化。类模板实际上是一种模板,我们可以使用它来定义一类通用的类,其中包含一个或多个类型参数,以表示可能包含多种不同类型的数据。模板类的优势在于可以帮助我们编写通用代码,这样可以显著提高代码的重用性和开发效率。原创 2023-06-14 12:49:55 · 144 阅读 · 0 评论 -
c++模板类与模板函数之间的区别
比如,我们可以使用一个模板类来实现一个通用的容器类,该容器类可以存储不同类型的数据。总之,在 C++ 中,模板类和模板函数是非常有用的工具,尤其是在需要处理多种不同类型数据的情况下,使用它们可以极大地简化程序的编写,提高程序的效率和可维护性。表示类型参数 T 的类型,可以使用这个模板函数来表示一组不同的函数,这些函数都具有相同的数据类型 T。通常情况下,我们使用模板类来创建可以适用于多种类型的类,而使用模板函数来创建可以适用于多种类型的函数。模板类和模板函数都是为了提高代码重用性和可维护性而设计的。原创 2023-06-14 12:43:41 · 295 阅读 · 0 评论 -
c++中释放指针delete后加一个[]是什么意思
则只会释放第一个元素所占用的内存空间,并不是整个数组,这就会导致内存泄漏。只会释放数组的第一个元素,而不会释放整个数组,这可能会导致内存泄漏。但是如果这块内存是通过数组形式分配的,使用。,表示此处释放的是一个数组,而不是一个单独的变量。这样就可以释放整个数组占用的内存。运算符分配的动态内存,需要使用。为了释放整个数组,需要在。需要注意的是,只有使用。进行释放,使用普通的。分配的内存只需要使用。原创 2023-06-14 09:31:48 · 1409 阅读 · 0 评论