C++学习笔记,第一章和第二章
1 C++简介
这一段可以自己看一下,都是一下无关急要的简述。
2 开始学习C++
//MyFrist.cpp
#include<iostream>
using namespace std;
int main(){
cout << "Come up and C++ me some time.";
cout << endl;
cout << "You won't regret it!" << endl;
system("pause");
}
// Author: 崔小葵
// Data: 2020-10-12
2.1 进入C++
2.1.1 main()函数的基本结构
int main(){
statements //信息的主体部分
return 0;
system("pause"); //这一行主要是为了能够让控制台不闪退,VScode中会有用处。
}
(statements为函数的主体部分,可以在这个部分写函数语句。)
2.1.2 函数头
main() //original C style
int main(void) //very explicit style
void main()
在C语言中,省略返回类型相当于说函数的类型为int。而C++逐渐的淘汰这种用法;
第二行中在括号中使用关键字void明确的指出,函数不接受任何参数。在C++(不是C)中,让括号空着与括号中使用void等效(在C中,让括号空着意味着对是否接受参数保持沉默);
第三行中可以直接使用这种函数头,同时省略返回语句;
2.1.3 C++预处理器和iostream文件
#include<iostream>
using namespace std;
iostream中io指的是输入(in
-进入程序的信息)和输出(out
-从程序中发送出的信息)。C++的输入/输出方案中涉及到iostream
文件中多个定义。为了使用cin来输入数据和cout输出数据
,第一个程序需要这些定义。#include
编译指令导致iostream文件的内容随源代码文件的内容一起发送给编译器。实际上,iostream
文件的内容将取代程序中代码行#include< iostream >
。原始文件没有被修改,而是,将源代码文件和iostream组合成一个符合文件,编译下一阶段将使用该文件。
像iostream这样的文件叫做包含文件(includeing file)----由于它们被包含在其他文件中;也叫头文件(header file)
这个表格很好的解释了为什么C与C++的头文件定义不同点
2.1.4 名称空间
如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用;
using namespace std;
这叫using编译指令。类、函数很变量便是C++编译器的标准组件,它们现在都被安置在名称空间std中。
当且仅当头文件中没有扩展名h时,情况才是如此。这意味着在iostream
中定义的用于输出的cout
变量实际上是std::cout
,而endl实际上是std::endl
。因此,可以省略编译指令using
,以下述方法进行编码;
std::cout << "Come up and C++ me some time.";
std::cout << std::endl;
std::cout << "Come up and C++ me some time.<< std::endl"
using指令的出现,其实是一种可以偷懒的方法。
using std::cout; //Correspond to cout
using std::endl; //Correspond to endl
using std::cin; //Correspond to cin
加上using namespace std;
是一种lazy approach。
2.2.5 cout
cout
对象有一个简单的接口,如果string是一个字符串.,则下面的代码将显示该字符串;
cout << string;
2.1.6 endl
和\n
的区别
endl是一种特殊的C++符号,表示一个重要的概念:重起一行
而在C++编译器中,我们看一段代码就可以明白;
#include<iostream>
using namespace std;
int main(){
cout << "The Good, The";
cout << "Bad, " << endl;
cout << "and the Ukulele";
cout << endl;
system("pause");
}
C++中还提供了另一种在输出中只是换行的旧式方法:C语言符号\n;
#include<iostream>
using namespace std;
int main(){
cout << "The Good, The";
cout << "Bad,\n " ;
cout << "and the Ukulele";
cout << endl;
system("pause");
}
虽然这边的区别还不是很大,但是在C++中是这样定义的
template <class _CharT, class _Traits>
inline _LIBCPP_INLINE_VISIBILITY
basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os)
{
__os.put(__os.widen('\n'));
__os.flush();
return __os;
}
很容易看出来,endl
做了三件事儿(把大象装冰箱需要几步?(划掉):
1.把\n放到输出流的缓冲区中;
2.把缓冲区的内容刷新到设备中;
3.返回输出流。
endl
被称作是C++中的操纵符(manipulator
),但实质上它如上面所看到的,是一个函数模板。
事实上这边我也不是特别懂,后续更新中会进一步解释的
endl
确保程序继续运行前刷新(将其立即显示在屏幕上);而使用\n
不能提供这样的保证,这意味着在有些系统中,又是可能在你输入信息后才会出现提示。
2.2 C++语句
#include<iostream>
using namespace std;
int main(){
int carrots;
cin >> carrots;
cout << "I have " << carrots << "carrots." << endl;
carrots = carrots - 1;
cout << "Crunch, crunch. Now I have " << carrots << "carrots." << endl;
system("pause");
}
// Author: 崔小葵
// Date: 2020-11-12
2.2.1 声明语句和变量
在C++中int代表整数,但是与C中的int有区别,C++的int类型可以为正,也可以为负。在之后的第三章会着重介绍。
int carrots;
这条语句提供了两项信息:
- 需要内存以及该内存单元的名称。—— 这条语句指出程序需要足够的存储空间来存储一个整数。
- 给存储单元指定名称。—— 这里用carrots来表示存储在该单元的值。
程序中的声明语句叫做定义声明(defining declaration)语句,这意味着它将导致编译器为变量分配内存空间。在较为复杂的情况下,还可能有引用声明(reference declaration)。
变量声明:
2.2.2 赋值语句
符号=叫做赋值运算符
在C++中有一个与C不寻常的特性———可以连续使用赋值运算符。
int a;
int b;
int c;
a=b=c=710;
在C++中赋值运算是从右向左的
就是先将710赋值给c;然后,c的值(现在的710)被赋值给b;最后b的值被赋值给c。
2.3其他C++语句
#include<iostream>
using namespace std;
int main(){
int carrots;
cout << "How many carrots do you have ? ";
cin >> carrots;
cout <<"Here are two more, ";
carrots =carrots + 2;
cout <<"Now you have "<< carrots <<" carrots." << endl;
system("pause");
}
// Author: 崔小葵
// Date: 2020-10-13
2.3.1 使用cin
和使用cout
进行拼接
上述程序的输出表明,从键盘中键入的(12)最终被赋值给变量carrots
。
cin >> carrots;
从这条语句中,我们可以知道信息从cin
流入到carrots
。
//片段一
cout <<"Now you have "<< carrots <<" carrots." << endl;
//片段二
cout <<"Now you have ";
cout << carrots ;
cout <<" carrots." ;
cout << endl;
//片段三
cout <<"Now you have ";
<< carrots ;
<<" carrots." ;
<< endl;
在上述代码中,我们可以发现其最后的输出都是一样的;
在C++中规定———C++的自由格式规则将标记间的换行符和空格看作是可以相互替换的(当代码行很长,限制输出的显示风格时,最后一种技术是很方便的)。
C++中将输出看作是流出程序的字符流一样,它也将输入看作是流入程序的字符流。
iostream
文件中将cin
定义为一个表示这种流的对象,输出时,<<
运算符将字符串插入到输出流中;输入时,cin
使用>>
运算符从输入流中抽取字符。通常在运算符左侧提供变量,以抽取的信息(符号<<
和>>
被选择用来指示信息流的方向)
2.3.3 类简介
类是用户定义的一种数据类型。
类定义描述了一种数据类型的全部属性(包括可使用它的执行的操作),对象根据根据这些描述创建实体。
2.4 函数
2.4.1使用有返回值的函数
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double area;
cout << "Enter the floor area, in square feet, of you home: ";
cin >> area;
double side;
side = sqrt( area );
cout << "That's the equivalent of a square " << side << " feet to the side." << endl;
cout << "How fanscinating!" << endl;
system("pause");
}
// Author: 崔小葵
// Date: 2020-10-13
注意: 如果使用老式编译器,则必须在程序清单中使用#include<math.h>
,而不是#include<cmath>
.
由于sqrt( )
处理的是double
值,因此这里将变量声明为这种类型。声明double
变量的句法与声明int变量相同;
2.4.2 函数变体
有些函数需要多项信息。这些函数使用多个参数,参数间用逗号分开。
//片段一
answer = pow( a , b ); //函数是计算a的b次方
//片段二
int rand(void);
//片段三
void buck(double);
bucks(a);
在这三个片段中
- pow()接受两个参数,返回值为以第一个参数为底,第二噶参数为指数的幂。
- rank()函数,返回一个随机数;关键字void明确指出,该函数不接受任何参数。而如果让括号为空,则C++将其解释为一个不接受任何参数的隐式声明。可以这样使用该函数。
- 原型中使用关键字void来指定返回类型,以指出该函数没有返回值。
2.4.3 用户定义的函数
#include<iostream>
using namespace std;
void simon(int );
int main(){
simon(3);
cout << "Pick an integer: ";
int count;
cin >> count;
simon(count);
cout << "Done" << endl;
system("pause");
}
void simon(int n){
cout << "Simon says touth your toes " << n <<" times." << endl;
}
// Author: 崔磊
// Date: 2020-10-13
这可能是一个比较恶搞的代码吧
main()
函数两次调用simon()
函数,一次的参数为3,另一次的参数为变量count.
1.函数格式
函数的定义与main()
的定义采用的格式相同
type functionname(argumentlist){
statements
}
注意: 定义的源代码位于main()
的后面。和C一样,但C++不允许将函数定义嵌套在另一个函数的定义中。每一个函数定义都是独立的,所有函数的创建都是平等的。
2.函数头
上述程序中simon()函数的函数头如下:
void simon(int n);
开头的void
表明simon()
没有返回值,因此调用simon()
不会生成可在main()中将其赋给变量的数值。
括号中的int n
表明,使用simon()
,应提供一个int参数。
C++中的int、void、return和double等。由于这些关键字都是C和C++专用的,因此不能作他用。也就是不能作为变量名。
3.函数的特性
- 有函数头和函数体
- 接受一个参数
- 返回一个值
- 需要一个原型
2.4.4 用户定义的有返回值的函数
#include<iostream>
using namespace std;
int stonetolb(int);
int main(){
int stone;
cout << "Enter the weight int stone: ";
cin >> stone;
int pounds = stonetolb(stone);
cout << stone << " stone = " << pounds << "pounds." << endl;
system("pause");
}
int stonetolb(int sts){
return 14 * sts;
}
// Author: 崔小葵
// Date: 2020-10-13
// 注解:一英石等于十四磅
//片段一
int stonetolb(int sts){
return 14 * sts;
//片段二
int stonetolb(int sts){
int pounds = 14 * sts;
return pounds;
在上述代码中,程序都将要计算返回值,然后在语句中使用这个值
这里片段一和片段二所产生的效果是一样的,这里通过使用较为复杂的表达式,避免了创建一个新变量。
参考书籍C++ primer plus 第二章