契约编程本质是"先签协议再合作"的工程思维。C++26提案将条件检查从函数体移至接口声明,让代码实现更干净,错误检测更前置。就像银行取款,规则写在合同里,执行时只需专注业务逻辑。
【代码演示】
#include <iostream>#include <stdexcept>// 🆕 C++26 真正的契约语法(提案中)class ModernBankAccount { int balance{1000};public: // 契约作为函数接口的一部分,不是函数体内的检查 void withdraw(int amount) [[expects: amount > 0]] // 前置条件:编译期可检查 [[expects: balance >= amount]] // 前置条件:运行期检查 [[ensures: balance == old(balance) - amount]] // 后置条件 [[ensures: balance >= 0]] // 不变量 { // 干净的实现:不需要手动检查参数 balance -= amount; } void deposit(int amount) [[expects: amount > 0]] [[ensures: balance == old(balance) + amount]] { balance += amount; } int getBalance() const { return balance; }};// 🔍 对比:传统方式需要手动检查class TraditionalBankAccount { int balance{1000};public: void withdraw(int amount) { // 这些检查应该由语言自动处理! if (amount <= 0) throw std::invalid_argument("金额必须为正"); if (amount > balance) throw std::runtime_error("余额不足"); balance -= amount; // 这些断言应该由语言自动验证! assert(balance >= 0); } int getBalance() const { return balance; }};int main() { std::cout << "=== 真正的契约编程 ===\n"; // 使用契约的代码看起来更干净 ModernBankAccount account; // 编译器/运行时会自动检查契约 account.withdraw(100); // ✅ 正常 // account.withdraw(-50); // ❌ 编译期或运行期自动报错 std::cout << "余额: " << account.getBalance() << "\n"; std::cout << "💡 契约在接口中声明,不在实现中检查!\n"; return 0;}