开始---《C++ primer》随笔
第一章
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》随笔相关推荐
- c++ primer随笔
1. 把int变量直接赋值给指针是错误的操作,即使int变量的值恰好等于0也不行. 2. 建议初始化所有指针. 3. 引用本身并不是一个对象,一旦定义了引用,就无法绑定其他对象,之后每次使用这个引用都 ...
- c++ primer 随笔
类的基本思想是数据抽象和封装.数据抽象是一种依赖于接口和实现分离的程序技术. 类要想实现数据抽象和封装,需要首先定义一个抽象数据类型. 定义抽象类 设计Sales_data类 使用改进的Sales_d ...
- C++ primer第五版随笔--2015年1月6日
记录自己看这本书时的一些内容. 一.引用(reference) 引用为对象起了另外一个名字.例如: int ival=1024: int &relVal1=ival;//对,注意尽量不要用这方 ...
- C++ Primer学习随笔(一)
第2章提到如下的概念: 1. 给予对象设计 2. 面向对象设计 两者的区别,从网上找了这么一段话: 面向对象的特征基本就是:封装,继承,多态 基于对象就只是没有继承. 基于对象就是只能对对象进行操作, ...
- C Primer Plus随笔
1.C99遵循C++的规范,可以将声明放在代码的任何位置:C99之前的编译器大多不支援此项 2.声明为变量分配内存,而赋值则是在内存中存值 3.函数原型不同于声明,声明省略参数的描述 4.整数和浮点数 ...
- android bsp学习_Android BSP成长计划随笔之虚拟设备搭建和input系统
由于工作关系,对Android关注将从FWK(Framework)转向BSP,也就是Linux Kernel.在工作的5年中,曾经数次研究过kernel,但一直没有合适的机会或者说推动力去深入研究.这 ...
- 《C++primer》第一章--开始
之前开始读<C++primer>,想着读书不动笔不如不读书,于是就想做一个读书笔记的内容,于是就想起了写一个<C++primer读思录>的一个专栏.一是为了给自己平时读书做 ...
- Echo团队Alpha冲刺随笔 - 第九天
项目冲刺情况 进展 已经进入测试阶段,正在消除系统的bug 问题 通过测试,找出了系统中存在的较多bug...... 体会 测试太重要了,很多原本以为没什么bug,一测就能找到好几个,而且改个bug真 ...
- 第一篇随笔——新的开端
新的开端 这是我第一次开通博客也是第一次在博客上写随笔,这既是博客的新开端也是JAVA学习的新开端,希望能好好经营这第一个博客~. 觉得自己专业吗?对专业的期望 对于这个问题我不得不坦然承认虽然进入信 ...
最新文章
- Linux包管理器apt/apt-get发现远程代码执行漏洞
- inputstream 初始化_MyBatis初始化之加载初始化
- navigator.userAgent 取值都带有Mozill的原因。看完我笑了
- ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍
- 2017年第八届蓝桥杯C/C++ C组国赛 —— 第三题:表达式计算
- 【Qt】Qt5.12编译MySQl5.7驱动(亲自测试成功)
- 中国工商银行基金定投
- 动手学习_动手选择值
- 百米路由器2登陆地址_腾达无线路由器怎么安装,真的不错
- android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
- leetcode4:Median of Two Sorted Arrays
- 浅谈css样式(border、background、table)
- 基于置信加权池的全卷积保证颜色恒常性
- 各种学习资料库,非常好的收藏汇总!!!!!
- 非安全黑客手册0911PDF电子书 下载
- IT行业岗位薪资大调查:收入最高的职位是什么?
- linux为什么要关闭防火墙,Linux怎么样关闭防火墙
- oracle查看日期是第几周
- 统计学知识:相关系数
- 概率论得学习和整理6:概率的分布