自学C++ 记录1
本人在大学期间已学过Java和一些C,现在工作上需要使用C++,以菜鸟教程为教材,记录一些笔记,方便日后复习和查找。
Hello World
#include <iostream> \\头文件,参考C
using namespace std;\\使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
// main() 是程序开始执行的地方
int main()
{
cout << "Hello World"; // 输出 Hello World
return 0;
}
三字符
三字符序列不太常见,但 C++ 标准允许把某些字符指定为三字符序列。以前为了表示键盘上没有的字符,这是必不可少的一种方法。参见
3种注释方式( comment)
/* 这是注释 /
/ C++ 注释也可以
* 跨行
*/
//这是注释
数据类型
7种基本的内置类型:bool, char, int, double, float, void, wchar_t(宽字符型)。
char
是8位字符类型,最多只能包含256种字符。wchar_t
数据类型一般为16位或32位,wchar_t所能表示的字符数远超char型。
可用signed, unsigned, short, long修饰。
typedef 声明
使用 typedef 为一个已有的类型取一个新的名字。
typedef int feet;
feet distance; //相当于 int distance
feet 是 int 的另一个名称, 用feet代替了int,创建了一个整型变量 distance
枚举类型(enumeration)
enum color { red, green, blue } c;
c = blue;
变量 c 的类型为 color。最后,c 被赋值为 “blue”。
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。
enum color { red, green=5, blue };
此时,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1,但 red 的值依然为 0。
变量作用域
局部(local variable)和全局
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | ‘\0’ |
float | 0 |
double | 0 |
pointer | NULL |
常量
字符串常量
#define 预处理器 定义常量
#define LENGTH 10
const 关键字定义常量
const int LENGTH = 10;
修饰符类型
前面有提到4个修饰符:signed, unsigned, short, long
此外还有类型限定符:const,volatile,restrict
。简单的介绍可以看这里,更详细的可以看这里
存储类
具体参考
存储类 | 介绍 |
---|---|
auto | 声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符 |
register | 用于定义存储在寄存器中 |
static | 编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁 |
extern | 提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。 |
mutable | 仅适用于类的对象 |
thread_local | 仅可在它在其上创建的线程上访问 |
运算符
和Java大部分相似
类 | 符号 |
---|---|
算术运算符 | +,-, *, /, %, ++, – |
关系运算符 | ==, !=, >, <, >=,<=, |
逻辑运算符 | &&, || , ! |
位运算符 | &, |, ^(异位), ~(翻转), <<, >> |
赋值运算符 | 算术运算符或位运算符后加上= |
循环语句
while, for, do…while
判断语句
if, if…else, else if, switch, Exp1 ? Exp2 : Exp3;
函数
类似Java的method
Lambda 函数与表达式
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
Lambda 表达式本质上与函数声明非常类似。
//[capture](parameters)->return_type {body}
[](int x, int y) -> int { int z = x + y; return z + x; }
随机数
关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main ()
{
int i,j;
// 设置种子
srand( (unsigned)time( NULL ) );
/* 生成 10 个随机数 */
for( i = 0; i < 10; i++ )
{
// 生成实际的随机数
j= rand();
cout <<"随机数: " << j << endl;
}
return 0;
}
数组
和Java类似
//type arrayName [ arraySize ];
double balance[10];
此外还增加了C中指针的用法
double *p;
double balance[10];
p = balance;
balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,上面的程序片段把 p 赋值为 balance 的第一个元素的地址。
*(balance + 4)
等同于*(p+4)
是一种访问 balance[4] 数据的合法方式。
字符串
C 风格字符串
字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello"; //两句话效果相同
不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。
C++ 中的 String 类
C++ 标准库提供了 string 类类型,类似Java中的string,可以直接复制、连接string等操作,不需要使用strcpy、strcat等函数。
指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。没学过C的人,需要详细了解下。这在Java中应该是没有的。详情
引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
主要是把它作为函数参数,以扩充函数传递数据的功能。
#include <iostream>
using namespace std;
// 函数声明
void swap(int& x, int& y);
int main ()
{
// 局部变量声明
int a = 100;
int b = 200;
cout << "交换前,a 的值:" << a << endl;//a=100
cout << "交换前,b 的值:" << b << endl;//b=200
/* 调用函数来交换值 */
swap(a, b);
cout << "交换后,a 的值:" << a << endl;//a=200
cout << "交换后,b 的值:" << b << endl;//b=100
return 0;
}
// 函数定义
void swap(int& x, int& y)//感觉就是把地址拿出来了
{
int temp;
temp = x; /* 保存地址 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 x 赋值给 y */
return;
}
基本的输入输出
<iostream>
该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
数据结构
其实就是C中的结构
数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
容易困惑的就是加上指针了
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books *book );
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Runoob");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "Runoob");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 通过传 Book1 的地址来输出 Book1 信息
printBook( &Book1 );
// 通过传 Book2 的地址来输出 Book2 信息
printBook( &Book2 );
return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
cout << "书标题 : " << book->title <<endl;
//为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符
cout << "书作者 : " << book->author <<endl;
cout << "书类目 : " << book->subject <<endl;
cout << "书 ID : " << book->book_id <<endl;
}