第一章


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++的一些基础语法

开始---《C++ primer》随笔相关推荐

  1. c++ primer随笔

    1. 把int变量直接赋值给指针是错误的操作,即使int变量的值恰好等于0也不行. 2. 建议初始化所有指针. 3. 引用本身并不是一个对象,一旦定义了引用,就无法绑定其他对象,之后每次使用这个引用都 ...

  2. c++ primer 随笔

    类的基本思想是数据抽象和封装.数据抽象是一种依赖于接口和实现分离的程序技术. 类要想实现数据抽象和封装,需要首先定义一个抽象数据类型. 定义抽象类 设计Sales_data类 使用改进的Sales_d ...

  3. C++ primer第五版随笔--2015年1月6日

    记录自己看这本书时的一些内容. 一.引用(reference) 引用为对象起了另外一个名字.例如: int ival=1024: int &relVal1=ival;//对,注意尽量不要用这方 ...

  4. C++ Primer学习随笔(一)

    第2章提到如下的概念: 1. 给予对象设计 2. 面向对象设计 两者的区别,从网上找了这么一段话: 面向对象的特征基本就是:封装,继承,多态 基于对象就只是没有继承. 基于对象就是只能对对象进行操作, ...

  5. C Primer Plus随笔

    1.C99遵循C++的规范,可以将声明放在代码的任何位置:C99之前的编译器大多不支援此项 2.声明为变量分配内存,而赋值则是在内存中存值 3.函数原型不同于声明,声明省略参数的描述 4.整数和浮点数 ...

  6. android bsp学习_Android BSP成长计划随笔之虚拟设备搭建和input系统

    由于工作关系,对Android关注将从FWK(Framework)转向BSP,也就是Linux Kernel.在工作的5年中,曾经数次研究过kernel,但一直没有合适的机会或者说推动力去深入研究.这 ...

  7. 《C++primer》第一章--开始

      之前开始读<C++primer>,想着读书不动笔不如不读书,于是就想做一个读书笔记的内容,于是就想起了写一个<C++primer读思录>的一个专栏.一是为了给自己平时读书做 ...

  8. Echo团队Alpha冲刺随笔 - 第九天

    项目冲刺情况 进展 已经进入测试阶段,正在消除系统的bug 问题 通过测试,找出了系统中存在的较多bug...... 体会 测试太重要了,很多原本以为没什么bug,一测就能找到好几个,而且改个bug真 ...

  9. 第一篇随笔——新的开端

    新的开端 这是我第一次开通博客也是第一次在博客上写随笔,这既是博客的新开端也是JAVA学习的新开端,希望能好好经营这第一个博客~. 觉得自己专业吗?对专业的期望 对于这个问题我不得不坦然承认虽然进入信 ...

最新文章

  1. Linux包管理器apt/apt-get发现远程代码执行漏洞
  2. inputstream 初始化_MyBatis初始化之加载初始化
  3. navigator.userAgent 取值都带有Mozill的原因。看完我笑了
  4. ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
  5. 2017年第八届蓝桥杯C/C++ C组国赛 —— 第三题:表达式计算
  6. 【Qt】Qt5.12编译MySQl5.7驱动(亲自测试成功)
  7. 中国工商银行基金定投
  8. 动手学习_动手选择值
  9. 百米路由器2登陆地址_腾达无线路由器怎么安装,真的不错
  10. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
  11. leetcode4:Median of Two Sorted Arrays
  12. 浅谈css样式(border、background、table)
  13. 基于置信加权池的全卷积保证颜色恒常性
  14. 各种学习资料库,非常好的收藏汇总!!!!!
  15. 非安全黑客手册0911PDF电子书 下载
  16. IT行业岗位薪资大调查:收入最高的职位是什么?
  17. linux为什么要关闭防火墙,Linux怎么样关闭防火墙
  18. oracle查看日期是第几周
  19. 统计学知识:相关系数
  20. 概率论得学习和整理6:概率的分布

热门文章

  1. poj 1185 NYOJ 85 炮兵阵地(状态压缩dp)
  2. python第三十二课——队列
  3. python操作docx学习资料
  4. Python学习-基础篇4 模块与包与常用模块
  5. 解决redhat的未注册问题
  6. ASP.NET-后台cookie与前台JQUERY解析cookie
  7. volatile 关键字
  8. fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  9. C++输入输出流进制转换
  10. linux 单网卡 路由,CentOS下双网卡单网关路由配置