C++类<二>:构造函数

上篇随笔中提到构造函数的介绍,这篇来深究一下.

构造函数名与类名一致.

构造函数的工作室保证每个对象的数据成员具有合适的初始值.例书店书籍构造体

class Sales_item{ 
 public:
        bool same_isbn(const Sales_item &rhs) const        //判断两书的isbn是否相同.
                            {  return isbn == rhs.isbn; }
        explicit Sales_item(const std::string &book):
                         isbn(book), units_sold(0), revenue(0.0){}
        explicit Sales_item(std::istream &is);                      
 private:
    std::string isbn;                                           
    unsigned int units_sold;
    double revenue;     
      };

一,构造函数可被重载

Sale_item(const std::string &book):  初始化数据  {};

Sale_item(std::istream &is);

Sale_item();

均为构造函数,使用时根据传入实参来决定使用哪个函数.

需要创建该类型的对象,编译器就会运行一个构造函数

 

二,构造函数初始化式

① Sale_item():  初始化列表(初始化阶段) {(普通的计算阶段)}

   在普通的计算阶段进行对数据成员赋值可达同样效果,但是.......

   没有默认构造函数的类类型的成员  & const数据成员 & 引用类型成员

   这三种数据成员都必须在初始化列表中进行初始化.

②按初始化次序初始化

   Sale_item(int val):j(val), i(j) {}

   这种有先后传递关系的初始化必须按照初始化顺序排列;

③,默认构造函数

   只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数

   (包括定义了非空参数构造函数,编译器都不会合成默认构造函数)

   Sale_item myobj = Sale_item();

   创建并初始化一个类对象用来初始化myobj.

 

三,隐式类类型转换,显式使用构造函数.

①隐式类类型转换

   调用成员函数same_isbn(const Sale_item &rhs)时,函数期待一个Sale_item类型的形参,

   若此时传入字符串"9-999-99999-9".   即myobj.same_isbn("9-999-99999-9");

   编译器使用一个接受一个 string 的 Sale_item 构造函数从字符串生成一个新的 Sale_item 对象(临时的)

   传给 same_isbn 函数.     这个行为称为隐式类类型转换.

②显式使用构造函数

   如篇头类中构造函数所示,于构造函数前添加 explicit ,则所产生的 Sale_item 对象在使用成员函数时的

   隐式类类型转换将被抑制.

   此时需要使用显式构造函数传递实参给函数 same_isbn() .即

   myobj.same_isbn(Sale_item("9-999-99999-9"));

  

四,类成员的显式初始化

   struct Data{   int ival ;   char *ptr;   };

   Data val1 = { 0 , 0};

   Data val2 = { 1024, "A string"};

  显示初始化只需按类的数据成员的定义顺序来进行逐项初始化.

<think>嗯,用户问的是关于将PoseT封装为PythonC++代码,并希望得到解释。首先,我需要理解这段代码的结构和用途。看起来像是用Boost.Python进行C++到Python的绑定。用户提供的代码是一个模板结构体PoseT_Wrapper,里面有一个静态的wrap方法,里面用class_声明了PoseT<T>的Python绑定,包括构造函数和成员变量的暴露。 我需要先确认用户是否熟悉Boost.Python,如果不熟悉的话,可能需要先简单介绍一下Boost.Python的作用。然后解释模板在这里的用途,为什么需要封装成Python。接着,逐行分析代码中的各个部分,比如.def(init<>())是用来定义构造函数的,.def_readwrite是用来暴露成员变量的。 可能用户是希望将现有的C++导出到Python中使用,因此需要了解如何正确使用Boost.Python进行封装。需要注意模板在Boost.Python中的处理方式,可能需要显式实例化模板参数,比如针对float或double型的具体实例化,否则在Python中无法正确使用。 另外,代码中的PoseT有point_和yaw_两个成员变量,用户可能需要知道在Python中如何访问这些变量,所以解释def_readwrite的作用是必要的。同时,构造函数的不同重载也需要说明,比如默认构造函数、带三个参数的构造函数和拷贝构造函数。 还要考虑到用户可能的后续问题,比如如何处理模板的不同实例化,或者如何编译这个绑定代码,是否需要额外的注册步骤。不过根据用户当前的问题,可能只需要解释现有代码的结构和功能,不需要深入编译细节。 最后,确保用中文清晰解释每个部分,结构分明,帮助用户逐步理解代码的各个部分。可能还需要举例说明在Python中如何使用这个封装后的,比如创建实例、访问属性等,以增强理解。</think>我将从浅入深解释这个C++到Python的封装实现: 1. 基础结构分析 这个代码段使用了Boost.Python库进行C++到Python的绑定封装。核心目标是让Python可以操作C++的PoseT模板,主要包含以下要素: - 模板参数`<T>`:支持多种数据型(如float/double) - `PoseT_Wrapper`结构体:封装操作的容器 - `wrap()`静态方法:实际的绑定逻辑入口 - 构造函数绑定:提供三种初始化方式 - 成员变量暴露:开放point和yaw的读写权限 2. 逐层分解实现 (1) 模板封装结构 $$PoseT\_Wrapper<T>$$ 通过模板结构体实现对不同数值型PoseT的统一封装。例如: - `PoseT_Wrapper<float>`对应单精度版本 - `PoseT_Wrapper<double>`对应双精度版本 (2) 绑定入口方法 `.def(init<>())` ➔ 默认构造函数绑定 `.def(init<T, T, T>())` ➔ 接收三个T型参数的构造函数 `.def(init<const PoseT<T>&>())` ➔ 拷贝构造函数 (3) 成员变量绑定 ```cpp .def_readwrite("point", &PoseT<T>::point_) .def_readwrite("yaw", &PoseT<T>::yaw_) ``` 将C++的成员变量直接映射为Python属性,保持可读写特性 3. 使用场景示例(Python端) ```python # 创建实例 pose1 = PoseT() # 默认构造 pose2 = PoseT(1.0, 2.0, 3.14) # 参数构造 pose3 = PoseT(pose2) # 拷贝构造 # 访问属性 pose2.point = (3.0, 4.0) # 修改坐标 current_yaw = pose3.yaw # 读取偏航角 ``` 4. 关键实现建议 - 需要显式实例化模板参数: ```cpp template class PoseT_Wrapper<float>; template class PoseT_Wrapper<double>; ``` - 配合Boost.Python模块导出: ```cpp BOOST_PYTHON_MODULE(your_module) { PoseT_Wrapper<float>::wrap(); PoseT_Wrapper<double>::wrap(); } ``` - 建议为point成员实现tuple自动转换,提升Python易用性 5. 扩展应用方向 - 添加成员函数绑定(如坐标变换方法) - 实现运算符重载(如==, +, -等) - 添加pickle支持实现序列化 - 集成numpy数组交互功能 这个封装模式在机器人、自动驾驶等领域的位置姿态表示中非常典型,通过Python绑定可以方便地进行算法原型验证和可视化调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值