16、为字符串定义一个操作,以生成其值的 C 风格字符串表示形式。讨论将该操作作为转换运算符的优缺点。讨论为该 C 风格字符串表示形式分配内存的替代方案。
- 可定义
char* c_str(const string& s)函数生成 C 风格字符串表示形式。 - 将该操作作为转换运算符的优点是能提供隐式转换的便利;缺点是可能在意外情况下导致意外转换。
- 为 C 风格字符串表示形式分配内存的替代方案有:
- 使用静态对象缓冲区,避免每次都在自由存储区分配和释放对象;
- 将矩阵类型定义为句柄,管理表示对象以最小化分配和复制;
- 定义三元操作,自动调用表达式。
17、定义一个类似于 Vec4 的类 Vector,其构造函数 Vector::Vector(int) 接受一个整数参数来指定大小。同时,重载 [] 运算符以方便访问元素,并提供一个 size 函数来获取向量的大小。
以下是一个简单的 C++ 示例代码来定义这样的类:
#include <iostream>
#include <vector>
class Vector {
private:
std::vector<int> data;
public:
Vector(int size) : data(size) {} // 可以添加其他成员函数,如访问元素等
int& operator[](int index) {
return data[index];
}
const int& operator[](int index) const {
return data[index];
}
int size() const {
return data.size();
}
};
在上述代码中,定义了一个 Vector 类,其构造函数接受一个整数参数 size 来指定内部 std::vector 的大小。同时,重载了 [] 运算符以方便访问元素,并提供了 size 函数来获取向量的大小。
18、给定两个结构体:struct S { int x, y; }; struct T { char p; char q; }; 编写一个类 C,使得它能够使用来自某些 S 和 T 中的 x 和 p,就好像 x 和 p 是 C 的成员一样。
可以通过在类 C 中包含结构体 S 和 T 的对象,并提供相应的访问方法来实现。以下是示例代码:
#include <iostream>
struct S {
int x, y;
};
struct T {
char* p;
char* q;
};
class C {
public:
C(S s, T t) : s_obj(s), t_obj(t) {}
int getX() const { return s_obj.x; }
char* getP() const { return t_obj.p; }
private:
S s_obj;
T t_obj;
};
19、定义基类 base,其中有一个公有虚函数 iam(),该函数输出 “base”。从 base 类派生出两个类,并为每个派生类定义 iam() 函数,使其输出该类的名称。创建这些派生类的对象并调用它们的 iam() 函数。将派生类对象的指针赋值给 base* 指针,并通过这些指针调用 iam() 函数。
以下是实现该功能的 C++ 代码:
#include <iostream>
class base {
public:
virtual void iam() {
std::cout << "base\n";
}
};
class derived1 : public base {
public:
void iam() {
std::cout << "derived1\n";
}
};
class derived2 : public base {
public:
void iam() {
std::cout << "derived2\n";
}
};
int main() {
derived1 d1;
derived2 d2;
d1.iam();
d2.iam();
base* pb1 = &d1;
base* pb2 = &d2;
pb1->iam();
pb2->iam();
return 0;
}
在上述代码中,首先定义了基类 base ,其中包含虚函数 iam() 。然后从 <

最低0.47元/天 解锁文章
1858

被折叠的 条评论
为什么被折叠?



