C++:如何有效使用C++

本文深入探讨了C++编程中的核心概念,如声明与定义、初始化、构造函数及STL库的运用。强调了程序设计的目标,即追求易理解、易维护、可移植和高效。适合所有希望提升C++编程技能的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件编写的目标:易理解、易维护、可移植、可扩充、高效、并且有着预期的行为。

学习程序语言是一回事,学习如何以某种语言设计并实现高效程序则是另一回事。如下为强化程序与设计的建议几何。

术语(Terminology)——一份每一个程序员都应该了解的C++词汇

声明式(Declaration)

所谓声明式,是告诉编译器某个东西的名称和类型(type),但略去细节。如下都为声明式:

extern int x;//对象(object)声明式
std::size_t numDigits(int number);//函数(function)声明式
class Widget;//类(class)声明式

template<typename T>//模板(template)声明式
class GraphNode;

注意,当谈到整数x时称其为一个对象(object),即使它是个内置类型。也要注意,函数numDigit的返回类型是std::size_t,这表示类型size_t位于命名空间std内。

每个函数的声明揭示了其签名式(Signature),也就是参数和返回类型。一个函数的签名等同于该函数的类型。numDigits函数的签名是std::size_t(int),也就是说“这函数获得一个int并返回一个std::size_t”。C++对签名式的官方定义并不包括函数的返回类型,不过,此处会把返回类型视为签名的一部分。

定义式(Definition)

定义式的任务是提供编辑器一些声明式所遗漏的细节。对对象而言,定义式是编辑器为此对象拨发内存的地点。对function或function template而言,定义式提供了代码本体。对class或class template而言,定义式列出它们的成员:

int x;//对象的定义式
std::size_t numDigits(int number)//函数的定义式
{
  std::size_t digitsSoFar=1;
  
  while((number/=10)!=0) ++digitsSoFar;
  return digitsSoFar;
}
class Widget{//class的定义式
  public:
    Widget();
    ~Widget();
    ...
};
template<typename T>//template的定义式
class GraphNode{
  public:
    GraphNode();
    ~GraphNode();
    ...
}

初始化(Initialization)

初始化是“给予对象初值”的过程。对用户自定义类型的对象而言,初始化由构造函数执行。所谓default构造函数是一个可被调用而不带任何实参的函数。这样的构造函数要不没有参数,要不就是每个参数都有缺省值:

class A{
  public:
    A();//default构造函数
};
class B{
  public:
    explicit B(int x=0,bool b=true);//default构造函数
};
class C{
  public:
    explicit C(int x);//不是default构造函数
}

classes B和C的构造函数都被声明为explicit,这可阻止它们被用来执行隐式类型转换(implicit type conversions),但它们仍可被用来进行显示类型转换(explicit type conversions)

void doSomething(B bObject);//函数,接受一个类型为B的对象

B bObj1;//一个类型为B的对象
doSomething(bObj1);//正确,传递一个类型为B的对象给doSomething函数
B bObj2(28);//正确,根据int 28建立一个B对象

doSomething(28);//错误,doSomething应该接受一个B,不是一个int,而int至B之间并没有隐式转换
doSomething(B(28));//正确,使用B构造函数将int显式转换(也就是转型,cast)为一个B以促成此一调用

被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎,因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非有一个好理由允许构造函数被用于隐式类型转换,否则一般会把构造函数声明为explicit

copy构造函数

copy构造函数被用来“以同型对象初始化自我对象”,copy assignment操作符被用来“从另一个同型对象中拷贝其值到自我对象”:

class Widget{
  public:
    Widget();//default构造函数
    Widget(const Widget& rhs);//copy构造函数
    Widget& operator=(const Widget& rhs);//copy assignment操作符
    ...
};
Widget w1;//调用default构造函数
Widget w2(w1);//调用copy构造函数
w1=w2;//调用copy assignment操作符

当看到赋值符号时,请小心,因为“=”语法也可用来调用copy构造函数:

Widget w3=w2;//调用copy构造函数

标准模板库(Standard Template Library,STL)

STL是C++标准程序库的一部分,致力于容器(vector,list,set,map)、迭代器(vector<int>::iterator,set<string>::iterator)、算法(for_each,find,sort)及相关机能。许多相关机能以函数对象(function objects)实现,那是“行为像函数”的对象。这样的对象来自于重载operator()(function call操作符)的classes。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值