C++与C编程:高级特性与基础操作解析
立即解锁
发布时间: 2025-08-20 01:48:58 阅读量: 1 订阅数: 3 


懒惰程序员的C++入门指南
### C++与C编程:高级特性与基础操作解析
#### 1. 反调试技巧
在进行位操作表达式编程时,可能会遇到结果错误但又难以发现问题的情况。常见的错误包括将逻辑运算符 `&&` 用于按位与 `&`,或者将逻辑或 `||` 用于按位或 `|`,也有可能是缺少必要的括号。
**练习题**:
1. 编写一个函数,通过检查数字的某一位来判断该数字是奇数还是偶数。
2. 编写一个函数,通过检查数字的位来以二进制形式打印该数字,可使用 `sizeof`。
3. 编写一个函数,使用右移运算符 `>>` 而不是除法运算符来计算整数的以2为底的对数。
4. 编写一个函数,判断一个数字中的位序列是否对称,例如 `11000011` 是对称的,而 `11010011` 不是。
#### 2. 受保护的部分与继承
在面向对象编程中,有时会遇到子类需要访问父类私有成员的情况。例如,`Phone` 类有一个私有成员函数 `incNumCalls()` 用于增加通话次数,而 `MobilePhone` 类在进行通话时也需要增加这个次数,但由于 `incNumCalls()` 是私有的,`MobilePhone` 无法直接访问。
C++ 提供了 `protected` 部分,它对外界不可见,但对子类可见。以下是示例代码:
```cpp
class Phone
{
public:
void call() { /*do some stuff, and then */ incNumCalls(); }
static int numCalls() { return numCalls_; }
protected:
void incNumCalls() { ++numCalls_; }
private:
static int numCalls_;
};
class MobilePhone : public Phone
{
public:
void call() { /* do stuff w cell towers, and */ incNumCalls(); }
};
```
此外,`protected` 还引入了一种新的继承类型——受保护继承。与公共继承不同,受保护继承会将父类的公共成员在子类中变为受保护成员。以下是不同继承方式的对比:
| 继承方式 | 特点 |
| ---- | ---- |
| 公共继承 | 子类中成员的访问权限与父类相同,不增加新的访问限制 |
| 私有继承 | 父类的所有成员在子类中变为私有成员 |
| 受保护继承 | 父类的公共成员在子类中变为受保护成员 |
下面是不同继承方式的代码示例:
```cpp
// 公共继承
class MobilePhone : public Phone
{
public:
void makeSecure();
void secureCall();
protected:
private:
};
// 私有继承
class MobilePhone : private Phone
{
public:
void makeSecure();
void secureCall();
protected:
private:
};
// 受保护继承
class MobilePhone : protected Phone
{
public:
void makeSecure();
void secureCall();
protected:
private:
};
```
#### 3. 模板特化
模板特化允许为特定的模板参数类型提供专门的实现。例如,对于 `Vector` 类的 `print` 函数,当元素类型为 `Superhero*` 时,默认的实现会打印指针地址,而我们希望打印 `Superhero` 对象本身。以下是模板特化的示例代码:
```cpp
template <typename T>
void Vector<T>::print (ostream& out) const
{
for (int i = 0; i < size(); ++i)
out << (*this)[i] << '/';
}
template<>
void Vector<Superhero*>::print (ostream& out) const
{
for (unsigned int i = 0; i < size(); ++i)
out << *((*this)[i]) << '/';
}
```
**练习题**:
1. 编写一个函数 `printBase3`,以三进制形式打印一个整数。然后编写 `Vector<T>::print` 的特化版本,以三进制形式打印所有整数。
2. 编写一个函数 `isOrdered`,如果 `std::pair` 的第一个元素小于第二个元素,则返回 `true`。但如果第一个和第二个元素是 `const char*`,则使用 `strcmp` 进行比较。
#### 4. 友元函数与类
在某些情况下,一个函数可能与一个类密切相关,但将其作为类的成员函数并不方便。这时可以使用友元函数,它可以访问类的所有成员,包括私有成员。例如,在比较两个 `Area` 对象哪个更靠北时,`furtherNorthThan` 函数需要访问 `Area` 类的私有成员 `boundingBox_`,可以将其声明为 `Area` 类
0
0
复制全文