C++学习笔记1:快速入门

作者: 云中布衣   分类:  学习笔记    热度: (296℃)   时间: 2017-6-17 22:48   标签: #始于C++而不止于C++    

看到标题快速入门,不知道你信不信,反正我是不信。C++作为一门超级难学的语言,没个几年时间,没人敢说他精通C++。既然是快速入门,前提是假设你会C语言,这篇笔记主要是走马观花式的介绍C++大部分基本要素:内置类型、库类型、类类型、变量、表达式、语句和函数,当然还会简单的介绍下如何编译和运行程序。(这个前两篇博文Makefile学习笔记,可以当做编译程序的进阶篇)下面,让我们开始C++一日游!

1.从简单的C++ Hello,Word! 程序开始

#include <iostream>
int main(){
    std::cout << "Hello,Word!"<<std::endl;
    return 0;
}

程序的第一行是预处理提示,它告诉编译器要使用iostream库

每个C++ 程序都包含一个或多个函数,而且必须有一个命名为main。函数由执行函数功能的语句序列组成。操作系统通过调用main函数来执行程序(需要注意的是main函数是唯一一个被操作系统显式调用的函数),main函数则执行组成自己的语句并返回一个值给操作系统。定义main函数和定义其他函数一样,必须指定四个元素:返回类型、函数名、圆括号里面的形参表(可能为空)和函数体。本示例中main函数的形参为空。main函数的返回值必须是int类型,该类型表示整数。int类型是内置类型,即该类型是由C++语言定义的。

编写好程序后,我们需要编译才能执行。所谓的编译是指高级语言通过编译系统翻译成可执行目标程序(二进制),在unix环境下,我们可以通过下面shell命令生成可执行文件hello:

g++ -o hello hello.cpp
然后再通过通过shell命令执行可执行目标程序hello:
./hello
这时我们能在终端中看到输出:Hello,Word!

2.初窥输入输出

C++并没有直接定义进行输入输出(IO)的任何语句,这种功能是由标准库iostream提供的。iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流好和输出流。流是指要某种IO设备上读入或写出的字符序列。

标准库定义了4个IO对象。标准输入cin,标准输出cout,标准错误cerr以及用来产生程序执行一般信息的clog。一般情况下,系统将这些对象与执行程序的窗口联系起来,但大部分操作系统都提供了重定向输入输出流的方法。利用重定向可以将这些流和所选择的文件联系起来。

上述Hello,Word程序main函数体中第一条语句执行了一个表达式。C++中一个表达式由一个或几个操作数和通常一个操作符组成。该语句的表达式使用输出操作符(<<),endl是一个特殊值,成为操纵符(maipulator),将他写入输出流,具有换行的效果并刷新与设备相关联的缓冲区(buffer)。 而std::cout的写法使用了作用域操作符(::),表示使用的是定义在命名空间std中的cout。

3.C++中的注释

单行注释以双斜线(//)开头,行中处于双斜线右边的内容是注释,被编译器忽略。另一种定界符,注释对(/**/)是从C语言继承过来的,注释对中间的内容为注释。需要注意的是,注释对不可嵌套!

4.控制结构(while for if )

其中while和for为循环结构,提供了迭代执行功能;if 为分支结构,提供了条件执行的功能。

5.类的简介

C++ 中我们通过定义类来定义自己的数据结构。类机制是C++中最重要的特征之一,事实上,C++设计的主要焦点就是使所定义的类类型(class type)的行为可以像内置类型一样自然。我们前面已看到项istream和ostream这样的库类型,都是定义为类的,也就是说,它们严格来说不是语言的一部分。下面是一个Sales_item类的实现,后面C++基础部分的学习主要围绕着这个文件展开。

#include <iostream>
#include <string>
class Sales_item {
friend std::istream& operator>>(std::istream&, Sales_item&);
friend std::ostream& operator<<(std::ostream&, const Sales_item&);
friend bool operator<(const Sales_item&, const Sales_item&);
friend bool 
operator==(const Sales_item&, const Sales_item&);

public:
    // default constructor needed to initialize members of built-in type
    Sales_item() = default;
    Sales_item(const std::string &book): bookNo(book) { }
    Sales_item(std::istream &is) { is >> *this; }
public:
    // operations on Sales_item objects
    // member binary operator: left-hand operand bound to implicit this pointer
    Sales_item& operator+=(const Sales_item&);
    
    // operations on Sales_item objects
    std::string isbn() const { return bookNo; }
    double avg_price() const;
// private members as before
private:
    std::string bookNo;      // implicitly initialized to the empty string
    unsigned units_sold = 0; // explicitly initialized
    double revenue = 0.0;
};

inline
bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) 
{ return lhs.isbn() == rhs.isbn(); }

// nonmember binary operator: must declare a parameter for each operand
Sales_item operator+(const Sales_item&, const Sales_item&);

inline bool 
operator==(const Sales_item &lhs, const Sales_item &rhs)
{
    // must be made a friend of Sales_item
    return lhs.units_sold == rhs.units_sold &&
           lhs.revenue == rhs.revenue &&
           lhs.isbn() == rhs.isbn();
}

inline bool 
operator!=(const Sales_item &lhs, const Sales_item &rhs)
{
    return !(lhs == rhs); // != defined in terms of operator==
}

// assumes that both objects refer to the same ISBN
Sales_item& Sales_item::operator+=(const Sales_item& rhs) 
{
    units_sold += rhs.units_sold; 
    revenue += rhs.revenue; 
    return *this;
}

// assumes that both objects refer to the same ISBN
Sales_item 
operator+(const Sales_item& lhs, const Sales_item& rhs) 
{
    Sales_item ret(lhs);  // copy (|lhs|) into a local object that we'll return
    ret += rhs;           // add in the contents of (|rhs|) 
    return ret;           // return (|ret|) by value
}

std::istream& 
operator>>(std::istream& in, Sales_item& s)
{
    double price;
    in >> s.bookNo >> s.units_sold >> price;
    // check that the inputs succeeded
    if (in)
        s.revenue = s.units_sold * price;
    else 
        s = Sales_item();  // input failed: reset object to default state
    return in;
}

std::ostream& 
operator<<(std::ostream& out, const Sales_item& s)
{
    out << s.isbn() << " " << s.units_sold << " "
        << s.revenue << " " << s.avg_price();
    return out;
}

double Sales_item::avg_price() const
{
    if (units_sold) 
        return revenue/units_sold; 
    else 
        return 0;
}
#endif

1.6基于Sales_item类的C++程序

Sales_item类的目的是存储书籍的ISBN并保存该书的销售册数、销售平均收入和平均售价。我们暂时不用关心如何存储或计算这些数据,,使用这个类我们不需要知道这个类是怎么实现的,相反我们只需要知道这个类提供什么操作。基于这个类,我们可以读入或写出Sales_item对象、将Sales_item对象相加。下面是读入和写出Sales_item对象的代码:

#include <iostream>
#include "Sales_item.h"
int main(){
    Sales_item book;
    // read ISBN, number of copies sold, and sales price
    std::cin >> book;
    // write ISBN, number of copies sold, total revenue, and averge price
    std::cout << book << std::endl;
    return 0;
}

(完)

56.8K

发表评论:

© 云中布衣 2015 | Driven by EMLOG  | SiteMap | RunTime: 7.91ms&RSS  |   | 回到顶部

文章数量【230】 评论数量【156】 稳定运行【1030天】

Visitor IP Address【23.20.240.193】