C++笔记(一)【基础知识】
文章目录
一、整体规范
1.1 C++对C的扩充
- 变量的定义可以出现在任何行
- 提供了标准输入输出流对象cin,cout
- 用const定义常变量
- 函数重载,函数模板,带默认值的函数
- 引用类型
- 单目作用域运算符
- string类型字符串
- 使用new和delete代替malloc和free函数等
c++是面向对象的,c是面向过程的。
c++11是最流行的版本
1.2 开发工具
- 记事本(notepad+=)+命令行
- Visual C++ 6.0(经典,但与流行OS不兼容)
- VS 2015或VS2017(功能强大,但体积大,而且是微软的C系列)
- Code::Blocks(目前如日中天的开源c++开发工具)
- DEV C++(很经典,但05年开始停止更新)
1.3 关于头文件
头文件的命名约定如下:
头文件类型 | 约定 | 示例 | 说明 |
---|---|---|---|
c旧风格 | 以.h结尾 | stdio.h | c,c++通用 |
c++旧风格 | 以.h结尾 | iostream.h | c++可以使用 |
c++新风格 | 没有扩展名 | iostream | c++使用,需要用namespace |
转换后的c | 加上前缀c并且没有扩展名 | cmath | c++使用 |
#开头的语句为预处理器指令
#include<iostream>输入流流到管道中,这里的管道为cout(c out),管道连向内存。进程间通信也是借助管道进行通信
命名空间(namespace)
using namespace std
(standard,使用命名空间为std,使用标准命名空间)这句没有的话,cout前要加std::,但若有重名的,就需要要显式的用。相当于python中的import as
其他用法:
using std::cout;
using std::cin;
using std::endl;
include中<>和""的区别
#include <windows.h>
<>表示,从编辑器默认的路径中去找文件stdio.h.这个默认的路径,取决于编译器.不同平台下不同编译器的路径都不相同.这个默认的路径下,已经包含了c标准库所需的所有头文件.
使用c++标准库的头文件使用该方法.
#include “mytest.h”
""表示从当前目录下寻找文件mytest.h。如果当前目录下找不到,再从编辑器默认的路径中查找。使用用户自定义的头文件使用该方法。
头文件 | 函数 |
---|---|
<stdio.h>或者<cstdio> | printf |
<iostream> | cout,cin,endl |
备注:endl有清空缓存区的功能
printf("我的名字是:%s",tlj)
1.4 编译执行过程
预处理->编译->目标文件->链接
- 预处理:把#include语句的相关库,代码包含进来(.ii)
- 编译:转为汇编文件(.s)
- 目标文件(汇编):可执行的二进制文件(.o)
- 链接:与c++函数库连接形成.exe文件
二、数据类型
2.1 常用数据类型
数据类型 | 符号 | 位数 | 范围 |
---|---|---|---|
整型 | int | 32 | -2147483648~+2147483647 |
短整型(谨慎使用) | short int | 16 | -32768~+32767 |
长整型(与int范围一样的) | long int | 32 | -2147483648~+2147483647 |
单精度浮点型(谨慎使用) | float | 32 | -3.4E-38+3.4E+38(只有67为有效数字,精度很低) |
双精度浮点型 | double | 64 | 1.7E-308~1.7E308(十五位有效数字) |
字符型 | char | 8 | 隶属于整型(bool类型也是隶属于整型),机器中还是按照整型存放 |
其他 | long long int(c++11标准中增加的);long double |
//定义别名
typedef char wode_char;
wode_char name='a';
//自带的提前定义好的
size_t t;
//相当于
unsigned int t;
//宏定义的固定常量,系统自带的,全大写
INT_MAX;
//相当于
#define INT_MAX 2147483647;
//若系统没有则在头文件加个 #include <climits>
//保留小数后两位
cout << fixed << setprecision(2);
//测量数据类型的长度
cout << sizeof(double) << endl;
//字符串加的时候会以ascii码大小运算
cout << 'A'+' ' << endl;
//A为65 空格为 32 因此为97
cout << (char)('A'+' ') << endl;
//a
//
cin >> num;//scanf("%d",&num);
chi1=cin.get();//获取一个字符
//字符串数组
//c++风格
string names="tlj";
//c风格
char names[]="tlj";
char* name="";
其他数据类型:
size_t类型,枚举类型,自定义类型,指针类型,空类型等。
2.2 常量问题
//c风格
define N 5; //这种方式叫宏定义,但是不好,因为只有在下面语句中遇到N的时候才替换,这意味着没替换前的N要占内存空间开销
//c++风格
const int N=20;//这里定义的就是真正的常量,遇到的N就是常量,不需要ti'huan
for (int i=0;i<N;i++)
{
cout << i << endl;
}
三、运算符与表达式
/* 取模运算 */
int num1=-5,num2=2;
cout << num1%num2 << endl; //符号取决于num1
//取模运算场景
//取某个数的个位数
//一个月余多少天
num1= num2++ - --num2;
//num1=0 num2=2
//num2先减一,因为在同一行,前面的num2也会变为1之后1-1=0 num2再加一,即整个表达式运算完后才算
int num1=0;
int num2=2;
num1= num2++ - num2--;
// num1=-1 num2=2 这里不太明白为什么
3.1 关于i++与++i
i++是先赋值,然后再自增;++i是先自增,后赋值。
用代码表示就是:
若 a = i++; 则等价于 a=i;i=i+1;
而 b = ++i; 则等价于 i=i+1;b=i;i++ 与 ++i 的主要区别有两个:
1、 i++ 返回原来的值,++i 返回加1后的值。
2、 i++ 不能作为左值,而++i 可以。
3.2 类型转换
原则:小范围的转换到大范围的
int num1=5,num2=2;
double num3=num1/num2;
// 2 因为表达式从右到左,先是两个整型相除得到2之后把2转成double类型的2
3.3 运算符优先级
- 单目运算符一般最高(! ~ +±- sizeof)这里的!和~是二进制的运算
- 算术运算符>关系运算符>逻辑运算符
3.4 switch 结构
switch(表达式)
{
case 常量1:
语句;
break;
case 常量2:
语句;
break;
default:
语句;
}