当前位置: 代码迷 >> 综合 >> 开始---《C++ primer》随笔
  详细解决方案

开始---《C++ primer》随笔

热度:42   发布时间:2023-11-07 18:41:03.0

第一章


1.1 编写一个简单的C++程序

int main(){return 0;
}

编写完上面的代码后,通过编译就可以运行程序了。


1.2 初始输入输出

#include<iostream> //标准输入输出库
using namespace std;    //标准库定义的所有名字都在命名空间std中
int main(){int n;              //定义变量ncin>>n;             //cin是标准输入cout<<n<<endl;      //cout是标准输出return 0;
}

也可以不用using namespace std,可以用std::cin和std::cout。如下。

#include<iostream> //标准输入输出库
int main(){int n;                              //定义变量nstd::cin>>n;                        //cin是标准输入std::cout<<n<<std::endl;            //cout是标准输出return 0;
}

其中

  • 输出运算符(<<)
  • 输入运算符(>>)
  • 作用域运算符(::)
  • endl操作符

这一节还介绍了一个重要的知识点endl操作符效果是换行并且将与设备关联的缓存区中的内容刷到设备中


1.3 注释简介

//这是单行注释
/*这是多行注释 */

注释在计算机里面起到重要作用,提高的程序的可读性


1.4 控制流

while语句 ,代码如下:

#include<iostream>
using namespace std;
/*输入一个整数试试。 */
int main(){int n;cout<<"输入一个整数:"<<endl;cin>>n;while(n--){cout<<n<<" ";}cout<<endl;
}

for语句,代码如下:

#include<iostream>
using namespace std;
/*输入一个整数试试。 */
int main(){int n;cout<<"输入一个整数:"<<endl;cin>>n;for(int i=0;i<n;i++){cout<<i<<" ";}cout<<endl;
}

if语句,代码如下:

#include<iostream>
using namespace std;
/*判断一个整数是否为偶数。 */
int main(){int n;cout<<"输入一个整数:"<<endl;cin>>n;if(n%2==0){cout<<n<<"是偶数";}else{cout<<n<<"是偶数";}cout<<endl;
}

1.5 类简介

C++中,我们通过定义一个类(class)来定义自己的数据类型。
这里,我们讨论三个下列问题:

  • 类名是什么?
  • 它是在哪里定义的?
  • 它支持什么操作?

下列代码与书中代码略有偏差,不过大体一致。读者可以复制尝试。
在编辑器(如vc++ 6.0)下面创建一个控制台(Console)项目
首先,我们在头文件文件夹下创建一个 Sales_item.h 文件(本人推测这个类的内部结构)。

#include<iostream>
#include<string>
using namespace std;
class Sales_item
{public:Sales_item();                                                       //无参构造函数Sales_item(const Sales_item &item);                                 //拷贝构造函数~Sales_item();                                                     //析构函数friend istream & operator>>(istream &is,Sales_item &item);          //重载输入运算符friend ostream & operator<<(ostream &os, Sales_item &item);         //重载输出运算符Sales_item & operator=(const Sales_item &item);                     //重载赋值运算符Sales_item & operator+(const Sales_item &item) const;               //重载加法运算符Sales_item & operator+=(const Sales_item &item);                    //重载复合赋值运算符const string & isbn() const;                                        //Sales_item的行为private:string isbn_no;                                                     //isbn编号int book_number;                                                    //图书数量float price;                                                        //图书价格
};

下列是对应的三个问题的答案

  • 从上面的模板可以看出Sales_item类名
  • 里面定义了它的成员函数数据成员
  • 成员函数提供对Sales_item的操作

接下来,我们在源文件里面创建一个 Sales_item.cpp 来实现Sales_item的细节

#include "Sales_item.h"
#include<iostream>
#include<string>
using namespace std;//无参构造函数,初始化成员数据
Sales_item::Sales_item():isbn_no(" "), book_number(0), price(0){cout << "create Sales_item" << endl;
}//拷贝构造函数
Sales_item::Sales_item(const Sales_item & item)
{this->isbn_no = item.isbn_no;                           //string类重载了赋值运算符(=)this->book_number = item.book_number;this->price = item.price;
}//析构函数
Sales_item::~Sales_item(){cout << "free isbn no : " << this->isbn_no << endl;
}//赋值运算符重载
Sales_item & Sales_item::operator=(const Sales_item & item)
{this->isbn_no = item.isbn_no;this->book_number = item.book_number;this->price = item.price;return *this;
}//加法运算符重载
Sales_item & Sales_item::operator+(const Sales_item & item) const
{Sales_item *i = new Sales_item();                       //系统调用析构函数会销毁new出来的这个对象if (item.isbn_no == this->isbn_no) {                    //string类重载了(==)运算符i->isbn_no = item.isbn_no;i->book_number = item.book_number + this->book_number;i->price= (item.price*item.book_number+this->price*this->book_number)/(i->book_number);}else {cout << "different isbn no" << endl;        //isbn号不相同}return *i;
}//复合运算符
Sales_item & Sales_item::operator+=(const Sales_item & item)
{if (this->isbn_no == item.isbn_no) {this->price= (item.price*item.book_number + this->price*this->book_number)/ (item.book_number + this->book_number);this->book_number += item.book_number; }else {cout << "different isbn no" << endl;}return *this;
}//Sales_item的行为,它只返回isbn号
//加上后者的const是为了不让isbn_no被修改
//加上前者的const是为了不让返回的isbn_no修改
const string & Sales_item::isbn() const
{return this->isbn_no;
}//输入运算符重载
istream & operator>>(istream & is, Sales_item & item)
{is >> item.isbn_no >> item.book_number >> item.price;return is;
}//输出运算符重载
ostream & operator<<(ostream & os, Sales_item & item)
{os << item.isbn_no<< " " << item.book_number<< " " << item.price*item.book_number<< " " << item.price;return os;
}

下面将进行读写Sales_item操作:

#include "Sales_item.h"
#include<iostream>
using namespace std;
int main()
{Sales_item book;cin >> book;cout << book << endl;getchar();getchar();return 0;
}

Sales_item对象加法操作:

#include "Sales_item.h"
#include<iostream>
using namespace std;
int main()
{Sales_item item1, item2;cin >> item1 >> item2;cout << item1 + item2 << endl;getchar();getchar();return 0;
}

到此,我们已经大致了解了什么是类。
接下来,我们讨论什么是成员函数?
如下代码:

#include "Sales_item.h"
#include<iostream>
using namespace std;
int main()
{Sales_item item1, item2;cin >> item1 >> item2;//检查item1和item2是否表示相同的书if (item1.isbn() == item2.isbn()) {      //isbn()就是Sales_item的成员函数cout << item1 + item2 << endl;getchar();getchar();return 0;       //表示成功}else {cerr << "Data must refer to same ISBN" << endl;getchar();getchar();return -1;      //表示失败}
}

从中,我们知道isbn()就是Sales_item的成员函数,它通过(类名.函数名)的形式而被调用,我们注意有一个”.”。(PS:成员函数一般也方法或者行为,它们三个是等价的。)


1.6 书店程序

书中程序的功能:总销售为total,当前交易为trans。通过程序可以算出,这一个进程结束之前的销售量(total)
可以自行代码尝试一下,挺好玩的一个程序。


小结

本节,对于本萌新来说收获颇大。主要讲解C++的一些基础语法

  相关解决方案