C++入门编程学习笔记(一)
一、C++初识
C++是一种面向对象的程序设计语言,我用的是Dev-C++ 5.15,主要原因是界面简洁,对于初学者来说用起来很简单。(链接: SourceForge下载)
打开Dev之后,配置了一下界面,预设了打开文件插入的代码片段,(作为一个女生,就想美美的),开始!
编写一个C++程序总共分为4个步骤:
- 创建项目
❀操作步骤:文件 —— 新建… —— 项目 —— 基本 —— 控制台应用程序 —— C++项目 —— 名称(自己写) —— 确定 .
❀此时的界面:左侧出现了“项目 1” ,下面包含一个“main.cpp”的文件,也就是源文件,可以通过右键单击“项目 1”往项目中添加头文件等。
- 创建文件
❀操作步骤:文件 ——新建源代码 .
❀此时的界面:创建了一个名为“新文件1”的文件,可以直接写代码。刚开始学C++还用不到项目的方式,所以可以直接创建源代码文件,编译运行保存为.cpp文件即可。
- 编写代码
❀操作步骤:在写C++程序时,有一个框架,在 *|*
处写代码:
#include <iostream>
using namespace std;
int main() {
*|*
system("pause");
return 0;
}
- 运行程序
❀操作步骤:按F9编译,按F10运行,按F11编译运行 .
1.1 输入输出:cin 和 cout
- 输出格式 cout<<…<<endl;
代码:
/*********************************************************************
程序名: 书写 Hello world
作者: Sweitena
日期: 2021-01-10 10:00
说明: 输出格式 cout <<...<< endl;
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
//输出的格式
cout << "Hello world!" << endl;
system("pause");
return 0;
}
运行结果图:
- 如果想显示多行文本,不用一直写cout实现多行输出,将输出改成如下格式就可以啦,代码片段:
cout << "...............\n"
<< "Hello world!\n"
<< "Welcome to c++\n"
<< "...............\n";
运行结果图:
- 输入格式 cin>>…;
代码:
/*********************************************************************
程序名:数据的输入
作者: Sweitena
日期: 2021-01-13 15:33
说明: 输入格式 cin << ...;
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
//整型变量输入 cin >>...;
int a;
cout << "请给变量a赋值:" << endl;
cin >> a;
cout << "a=" << a << endl;
system("pause");
return 0;
}
运行结果图:
1.2 注释: // 和 /**/
- 单行注释
- 多行注释
代码片段:
//1.单行注释:通常放在一行代码的上方或者一条语句的末尾,对该行代码说明
/*
2.多行注释
通常放在一段代码上方,对该段代码做整体说明 */
1.3 常量:#define 和 const
在 C++ 中,有两种简单的定义常量的方式:
- 使用 # define 预处理器。define和C语言中用法相同,可以定义一个宏常量。
- 使用 const 关键字。可以使用 const 前缀声明指定类型的常量。
两者区别:
- 类型和安全检查不同:
-①宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查;
-②const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查; - 编译器处理不同:
-①宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试;
-②const常量是一个"运行时"概念,在程序运行使用,类似于一个只读数据; - 存储方式不同
-①宏定义是直接替换,不会分配内存,存储与程序的代码段中;
-②const常量需要进行内存分配,存储与程序的数据段中; - 定义域不同
-①宏定义在所有函数外部声明,则是全局的,不受定义域限制;
-②const常量在在函数或一个代码块内部声明,则是局部的。 - 定义后能否取消
-①宏定义可以通过#undef N 12
来使之前的宏定义#define N 21
失效
-②const常量定义后将在定义域内永久有效 - 是否可以做函数参数
-①宏定义不能作为参数传递给函数
-②const常量可以在函数的参数列表中出现
const关键字应用:
- 欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;
- 对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
- 在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;
- 对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量;
- 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
代码:
/*********************************************************************
程序名: 常量的简单使用
作者: Sweitena
日期: 2021-01-10 10:05
说明: #define定义 \ const修饰
*********************************************************************/
#include <iostream>
using namespace std;
#define Day 7 //#define 宏常量
int main() {
cout << "一周一共有:" << Day << "天" << endl;
//const修饰的变量也成为常量
const int month = 12;
cout << "一年一共有:" << month << "月" << endl;
system("pause");
return 0;
}
运行结果图:
1.4 常用关键字
- C++ 的关键字(保留字)完整介绍,链接: 菜鸟教程.
- size of 关键字的使用:
/*********************************************************************
程序名:sizeof关键字
作者: Sweitena
日期: 2021-01-10 10:19
说明: 【作用】利用sizeof关键字可以统计数据所占内存大小
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
int num;
num = sizeof(int);
cout << "int占用内存空间为:" << num << endl;
int Array[5] = {1, 2, 3, 4, 5};
int len = sizeof(Array) / sizeof(Array[0]);
cout << "数组元素的个数为:" << len << endl;
system("pause");
return 0;
}
运行结果图:
1.5 转义字符
- 常用的转义字符:① \n ② \\ ③ \t
代码:
/*********************************************************************
程序名:转义字符
作者: Sweitena
日期: 2021-01-10 20:40
说明:【作用】用于表示一些不能显示的ASCII字符
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
/******常用的转义字符*******/
//①换行符\n或者endl
cout << "hello world\n";
cout << "HELLO WORLD" << endl;
//②反斜杠\\
cout << "\\" << endl;
//③水平制表符\t 整齐的输出数据
cout << "\thello world" << endl; //\t占了8个空间
cout << "aaaa\thello world" << endl; //前面总共8个空
system("pause");
return 0;
}
运行结果图:
1.6 三字符组
- 作用:三字符组就是用于表示另一个字符的三个字符序列。
- 三字符组总是以两个问号开头。
- 三字符组可以出现在任何地方,包括字符串、字符序列、注释和预处理指令。
下面列出了最常用的三字符序列:
三字符组 | 替换 |
---|---|
??= | = |
??/ | \ |
??’ | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
二、数据类型
- C++规定在创建一个变量或常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。
2.0 声明:typedef
- 作用:可以使用 typedef 为一个已有的类型取一个新的名字。
代码片段:
typedef int feet; //作用:告诉编译器,feet是int的另一个名称
feet x = 10; //这条语句是合法的,它创建了一个整型变量x并赋值为10
下面引用了知乎上的内容.
- 整形:
typedef int x; // 定义了一个名为x的int类型
- 结构体:
typedef struct { char c; } s; // 定义了一个名为s的struct类型
- 指针:
typedef int *p; //定义了一个名为p的指针类型, 它指向int
- 数组:
typedef int A[]; // 定义了一个名为A的ints数组的类型
- 函数:
typedef int f(); // 定义一个名为f, 参数为空, 返回值为int的函数类型
typedef int g(int); // 定义一个名为g, 含一个int参数, 返回值为int行的函数类型
2.1 整型:4种
- 作用:整型变量表示的是整数类型的数据
代码:
/*********************************************************************
程序名:整型
作者: Sweitena
日期: 2021-01-13 20:39
说明:【作用】整型变量表示的是整数类型的数据
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
//C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同
cout << "①整型:" << endl;
//短整型 short 最大是-2^15~2^25-1
short numZ_1 = 32768;
//整型 int 最大是-2^31~2^31-1
int numZ_2 = 32768;
//长整型 long 最大是-2^31~2^31-1
long numZ_3 = 2147483648;
//长长整型 long long 最大是-2^63~2^63-1
long long numZ_4 = 2147483648;
cout << "numZ_1 = " << numZ_1 << endl;
cout << "numZ_2 = " << numZ_2 << endl;
cout << "numZ_3 = " << numZ_3 << endl;
cout << "numZ_4 = " << numZ_4 << endl;
system("pause");
return 0;
}
运行结果图:
2.2 实型:float 和 double
- 作用:实型变量表示的是小数
- 浮点型变量分为两种:单精度 float // 双精度 double 。
- float 单精度浮点值。单精度的格式:1位符号,8位指数,23位小数。
- double 双精度浮点值。双精度的格式:1位符号,11位指数,52位小数。
代码:
/*********************************************************************
程序名:实型
作者: Sweitena
日期: 2021-01-13 20:50
说明:【作用】实型变量表示的是小数
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
cout << "②实型(浮点型)" << endl;
//单精度
float f1 = 3.1415926f;
//双精度
double d1 = 3.1415926;
cout << "3.1415926的单精度表示:" << f1 << endl;
cout << "3.1415926的双精度表示:" << d1 << endl;
//科学计数法
float f2 = 3e2;
float f3 = 3e-2;
cout << "表示科学计数:" << f2 << "和" << f3 << endl;
system("pause");
return 0;
}
运行结果图:
2.3 字符型:char
- 作用:字符型变量用于显示单个字符
- C和C++中字符型变量只占用1个字节;
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元。
代码:
/*********************************************************************
程序名:字符型
作者: Sweitena
日期: 2021-01-13 20:52
说明:【作用】字符型变量用于显示单个字符
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
//字符型 用于显示单个字符
cout << "③字符型" << endl;
//字符型变量创建-要用单引号,单引号里只能有一个字符
char ch = 'a';
cout << ch << endl;
//字符型变量对应ASCII编码
cout << "a对应的ASCII码值:" << (int)ch << endl;
system("pause");
return 0;
}
运行结果图:
2.4 字符串型:char
- 作用:字符型变量用于表示一串字符
- 注意:头文件需包含< string >
代码:
/*********************************************************************
程序名:字符串型
作者: Sweitena
日期: 2021-01-13 20:55
说明:【作用】字符型变量用于表示一串字符
*********************************************************************/
#include <iostream>
using namespace std;
#include <string>
int main() {
cout << "④字符串型" << endl;
//C语言风格的字符串
char str1[] = "hello world";
//C++风格的字符串
string str2 = "hello world";//头文件#include <string>
cout << str1 << endl;
cout << str2 << endl;
system("pause");
return 0;
}
运行结果图:
2.5 布尔类型: bool
- 作用:布尔数据类型代表真或假的值
- 布尔类型只有2个值:true 真(本质是1)// false 假(本质是0);
- 布尔类型只占1个字节。
代码:
/*********************************************************************
程序名:布尔类型
作者: Sweitena
日期: 2021-01-13 20:58
说明:【作用】布尔数据类型代表真或假的值
*********************************************************************/
#include <iostream>
using namespace std;
#include <string>
int main() {
cout << "⑤布尔类型" << endl;
//创建bool数据类型
bool flag = true;
cout << flag << endl; //1
flag = false;
cout << flag << endl; //0
cout << "size of bool:" << sizeof(bool) << endl;
system("pause");
return 0;
}
运行结果图:
2.6 枚举类型:enum
- 枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
- 如果一个变量只有几种可能的值,可以定义为枚举类型。
- 作用:将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
- 创建枚举时,需要使用关键字 enum。枚举类型的一般形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数]
} 枚举变量;
代码:
/*********************************************************************
程序名: 枚举类型
作者: Sweitena
日期: 2021-07-10 13:19
说明: 以days变量的三种可能的值为例,给出了两种用switch结构的例子
*********************************************************************/
#include <iostream>
using namespace std;
enum days {one, two, three}; //定义一个天数枚举
enum rank {first=3, second=6, third=9}; //定义一个排序枚举
int main() {
/**************************************************************************
例1 :
直接用变量作为判断条件
说明:
初始时给变量一个枚举组合中的一个名称,并以此判断该变量。
**************************************************************************/
enum days d = one; //变量d的类型为days,d被赋值为one
switch (d) {
case one:
cout << "one" << endl;
break;
case two:
cout << "two" << endl;
break;
default:
cout << "three" << endl;
break;
}
/**************************************************************************
例2 :
枚举变量对应的值作为条件
说明:
默认情况下,第一个名称的值为0,第二个名称的值为1,第三个名称的值为2,
以此类推,也可以给名称赋予一个特殊的值,只需要添加一个初始值即可
**************************************************************************/
int score = 3;
switch (score) {
case first: //相当于case 3:
cout << "第一名" << endl;
break;
case second: //相当于case 6:
cout << "第二名" << endl;
break;
case third: //相当于case 9:
cout << "第三名" << endl;
break;
default:
cout << "很遗憾未进入前三名" << endl;
break;
}
system("pause");
return 0;
}
运行结果图:
三、修饰符类型
- C++ 允许在int 、char和 double数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。
下面列出了数据类型修饰符:
- signed
- unsigned
- long
- short
数据类型 | 修饰符 |
---|---|
整型int | signed、unsigned、long、short |
字符型char | signed、unsigned |
双精度double | long |
- 修饰符 signed 和 unsigned 也可以作为 long 或 short 修饰符的前缀。例如:unsigned long int。
- C++ 允许使用速记符号来声明无符号短整数或无符号长整数。可以不写 int,只写单词 unsigned、short 或 unsigned、long,int 是隐含的。
代码:
/*********************************************************************
程序名: 修饰符
作者: Sweitena
日期: 2021-07-11 16:40
说明: 解释有符号整数和无符号整数修饰符之间的差别
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
short int i; // 有符号短整数
short unsigned int j; // 无符号短整数
j = 50000;
i = j;
cout << i << " " << j << endl;
/************************************
上边的例子的二进制数为下边的运行结果,
看到二进制就很好理解了
*************************************/
char s[40];
_itoa_s(i, s, 2);
printf("变量i的二进制数为:%s\n", s);
_itoa_s(j, s, 2);
printf("变量j的二进制数为:%s\n", s);
system("pause");
return 0;
}
运行结果图:
【对此例的解释】:对于无符号化为有符号的位数运算,采取 N-2n的计算方法,n 取决于定义的数据类型 int、short、char、long int 等等,N 为无符号数的数值,例如文中的 N=50000,short 为 16 位,计算方法为 50000-216得到 -15536。
四、限定符类型
- 类型限定符提供了变量的额外信息。
【注意】后面再进行补充
五、存储类
- 存储类定义为 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。
- C + + 存储类是一种类型说明符,该说明符控制对象的生存期、链接和内存位置。
- 给定对象只能有一个存储类。
- 在函数中定义的变量默认制定自动变量,除非使用 extern 或说明符进行了指定 static、thread_local 。
下面列出 C++ 程序中可用的存储类:
- auto 自动的
- register 寄存器的
- static 静态的
- extern 外部的
- mutable 可变的
- thread_local (C++ 11) 本地线程的
- 从 C++ 17 开始,auto 关键字不再是 C++ 存储类说明符,且register 关键字被弃用。
【注意】后面再进行补充
六、运算符
- 作用:用于执行代码的运算
- 主要有:算术运算符、赋值运算符、比较运算符、逻辑运算符
3.1 算术运算符
- 算术运算符作用:用于处理四则运算
- 算术运算符包括以下符号:
3.1.1 取模运算
- 取模运算的本质是求余数
- 两个数相除除数不能为0,取模时分母也不能为0
- C++规定两个小数不能做取模运算
代码:
/*********************************************************************
程序名:取模运算
作者: Sweitena
日期: 2021-03-17 14:30
说明: 取模运算的本质是求余数
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
int a1 = 10;
int b1 = 3;
cout << "10对3取模:" << a1 % b1 << endl; //返回1
int a2 = 10;
int b2 = 20;
cout << "10对20取模:" << a2 % b2 << endl; //返回被除数
/*
double d1 = 3.14;
double d2 = 1.1;
cout << d1 % d2 << endl; //小数不能做取模运算
*/
system("pause");
return 0;
}
运行结果图:
3.1.2 递增递减
- 前置递增:先让变量+1,然后进行表达式运算
- 后置递增:先进行表达式运算,后让变量+1
代码:
/*********************************************************************
程序名:递增递减
作者: Sweitena
日期: 2021-03-17 14:35
说明: 注意变量的值的变化
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
//1.前置递增
int a = 10;
++a;
cout << "a = " << a << endl;
//2.后置递增
int b = 10;
b++;
cout << "b = " << b << endl;
//3.前置后置的区别
//前置递增 先让变量+1,然后进行表达式运算
cout << "前置递增:" << endl;
int a2 = 10;
int b2 = ++a2 * 10;
cout << "a2 = " << a2 << endl;
cout << "b2 = " << b2 << endl;
//后置递增 先进行表达式运算,后让变量+1
cout << "后置递增:" << endl;
int a3 = 10;
int b3 = a3++ * 10;
cout << "a3 = " << a3 << endl;
cout << "b3 = " << b3 << endl;
system("pause");
return 0;
}
运行结果图:
3.2 赋值运算符
- 作用:用于将表达式的值重新赋给变量
代码:
/*********************************************************************
程序名:赋值运算符
作者: Sweitena
日期: 2021-03-17 14:58
说明:【作用】用于将表达式的值重新赋给变量
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
int a;
cout << "默认a=10的情况下:" << endl;
// +=
a = 10;
a += 2; //a = a+2
cout << "a += 之后的结果是" << a << endl;
// -=
a = 10;
a -= 2; //a = a-2
cout << "a -= 之后的结果是" << a << endl;
// *=
a = 10;
a *= 2; //a = a*2
cout << "a *= 之后的结果是" << a << endl;
// /=
a = 10;
a /= 2; //a = a/2
cout << "a /= 之后的结果是" << a << endl;
// %=
a = 10;
a %= 2; //a = a%2
cout << "a %= 取模之后的结果是" << a << endl;
system("pause");
return 0;
}
运行结果图:
3.3 比较运算符
- 作用:用于表达式的比较,并返回一个真值或假值
代码:
/*********************************************************************
程序名:比较运算符
作者: Sweitena
日期: 2021-03-17 15:17
说明:【作用】用于表达式的比较,并返回一个真值或假值
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
int a, b;
a = 10;
b = 20;
// ==
cout << (a == b) << endl; //返回0
// !=
cout << (a != b) << endl; //返回1
// < 或 >
cout << (a < b) << endl; //返回1
// <= 或 >=
cout << (a <= b) << endl; //返回1
system("pause");
return 0;
}
运行结果图:
3.4 逻辑运算符
- 作用:用于根据表达式的值返回真值或假值
代码:
/*********************************************************************
程序名:逻辑运算符
作者: Sweitena
日期: 2021-03-17 15:21
说明:【作用】用于根据表达式的值返回真值或假值
*********************************************************************/
#include <iostream>
using namespace std;
int main() {
int a, b;
a = 1;
b = 0;
//与 && 同真为真,同假为假
cout << (a && b) << endl;
cout << (a && !b) << endl;
//或 ||
cout << (a || b) << endl;
cout << (a || !b) << endl;
//非 !
cout << !a << endl;
cout << !!a << endl;
system("pause");
return 0;
}
运行结果图: