C++笔记

目录

一.建立c++工程

1.建立项目

2.创建源文件

3.c++代码初始模板

二.基本语言

2.1.注释

2.1.1单行注释

2.1.2单行注释

2.2.变量

2.3.常量

2.3.1.#define 宏变量

2.3.2.const修饰的变量

2.4.关键字

2.5.命名规则

2.6.数据类型

2.6.1.整型

2.6.2.sizeof关键字

2.6.3.实型(浮点型)

2.6.3.1.科学计数法

2.6.4.字符型

2.6.5.转义字符

2.6.6.字符串型

2.6.6.1.c风格字符串

2.6.6.2.c++风格字符串

2.6.7.布尔类型bool

2.6.8.数据的输入

三.运算符

3.1.算术运算符

3.1.1递增

3.1.2递减

3.2.赋值运算符

3.3.比较运算符

3.4.逻辑运算符

四.程序流程结构

4.1.选择结构

4.1.1 if语句

4.1.1.1 单行格式if语句:

4.1.1.1.2多行格式if语句

4.1.1.1.3多条件的if语句

4.1.2三目运算符

4.1.3switch语句

4.2.循环结构

4.2.1.while循环

4.2.2.do...while循环

4.2.3.for循环

4.3.跳转语句

4.3.1 break语句

4.3.2 continue语句

4.3.3 goto语句

五.数组

5.1一维数组

5.1.1一维数组定义

5.1.2一维数组数组名

​5.2二维数组

5.2.1二维数组定义方式

5.2.2二维数组数组名

六.函数

6.1概述

6.2定义

6.3调用

6.4值传递

6.5函数常见样式

6.6函数的声明

6.7函数的分文件编写

七.指针

7.1概念

7.2定义和使用

7.3所占用的内存空间

7.4 空指针和野指针

7.5const修饰指针

7.5.1常量指针

7.5.2指针常量

7.5.3const既修饰指针,也修饰常量

7.6指针和数组

7.7指针和函数

7.8指针,函数,数组

八.结构体

8.1概念

九.类和对象

9.1封装

9.1.1封装意义

9.1.1.1封装意义一

9.1.1.2封装意义二

9.1.2 struct与class区别

9.1.3成员属性设置为私有

9.2对象的初始化和清理

​9.2.1构造函数和析构函数

9.2.2构造函数的分类即调用

9.2.3拷贝构造函数调用时机

​9.2.4构造函数调用规则

9.2.5深拷贝与浅拷贝

​9.2.6初始化列表

9.2.7类对象作为类成员

​9.3继承

9.3.1继承基本语法

9.3.2继承方式

​9.3.3继承中构造和析构顺序

9.3.4多继承语法

十.MFC基本应用程序




一.建立c++工程

1.建立项目

  1. 选择c++,
  2. 选择windows,
  3. 选择控制台,
  4. 最后点击空项目
  5. 点击下一步
  6. 项目命名和保存路径

2.创建源文件

1.在源文件处右键选择添加选择新建项并且命名

3.c++代码初始模板

#include <iostream>
using namespace std;

int main()
{

	system("pause");

	return 0;
}

二.基本语言

2.1.注释

2.1.1单行注释

//   通常放在一行代码的上方,对该行做注释

2.1.2单行注释

/* 对该段做注释  */   

2.2.变量

作用:给一段指定的内存空间起名,方便操作管理这段内存

语法:数据类型  变量名 = 初始值;

#include <iostream>
using namespace std;

int main()
{
	int a = 5;

	cout << "a=" << a << endl;

	system("pause");

	return 0;
}

2.3.常量

作用:用于记录程序中不可更改的数据

有两种方式

2.3.1.#define 宏变量

语法:#define 常量名 常量值

        文件上方定义,表示一个常量,不可修改

2.3.2.const修饰的变量

语法:const 数据类型 常量名 = 常量值

        在变量定义前加关键字const,修饰变量为一个常量,不可修改

#define pi 3

const int a = 15;

2.4.关键字

作用:c++中预先保留的单词(标识符)

        在定义常量或变量时,不能使用关键字

2.5.命名规则

作用:给标识符(变量,常量)命名时,有自己的规则

  1. 标识符不能是关键字
  2. 第一个字符必须是字母或下划线
  3. 标识符只能由字母,数字,下划线组成
  4. 标识符中字母区分大小写
	int a = 5;
	int _123 = 6;
	int _156g = 6;

2.6.数据类型

规定一个变量和常量时,要指出相应的数据类型,否则无法给变量分配内存

给变量分配合适的内存空间

2.6.1.整型

作用:表示的是整形数据的数据

整型也分为好几种类型,各自所占的内存空间不同

1字节 = 8bit

8bit可用1个16进制表示

0x01 = 0000 0001                             2^7次方-1

2字节 = 16bit

0x0001 = 0000 0000 0000 0001       2^15次方-1

	short     a = 5;
	int		  b = 6;
	long      c = 6;
	long long d = 7;

	cout << "a=" << sizeof(a) << endl;
	cout << "b=" << sizeof(b) << endl;
	cout << "c=" << sizeof(c) << endl;
	cout << "d=" << sizeof(d) << endl;

2.6.2.sizeof关键字

作用:利用sizeof统计数据类型所占内存大小

语法:sizeof( 数据类型)      sizeof(变量)

2.6.3.实型(浮点型)

作用:表示小数

浮点型变量分为两种(区别在于表示的有效数字范围不同):

  1. 单精度float
  2. 双精度double

	float     a = 5.16f;
	double	  b = 6.48915615615;


	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

通常在float 定义的变量初始值后面加上f,不加的话编译器默认认为变量为double类型,多一步将double类型转换为float类型的步骤。

默认情况下,输出一个小数,会显示6位有效数字。

2.6.3.1.科学计数法
	float     a = 3e2; // 3 * 10 ^ 2
	double	  b = 3e-2;// 3 * 10 ^-2


	cout << "a=" << a << endl;
	cout << "b=" << b << endl;

2.6.4.字符型

作用:用于显示单个字符

语法:char ch = ‘a’;

注意:

  1. 用单引号将字符括起来,不是用双引号
  2. 单引号内只能有一个字符,不可以是字符串
  3. 只占用一个字节
  4. 不是把字符本身放在内存中存储,而是将其对应的ASCII编码的值放在存储单元

ASCII编码表

	char a = 'c';

	cout << "a=" << a << endl;
	cout << "十进制" << int(a) << endl;
	cout << "大小" << sizeof(a) << endl;

2.6.5.转义字符

作用:用于表示一些不能显示的ASCII字符

	cout << "aaaa\thello" << endl;
	cout << "aaaaaa\thello" << endl;
	cout << "a\thello" << endl;

2.6.6.字符串型

作用:表示一串字符

注意:

用的是双引号而不是单引号

2.6.6.1.c风格字符串

 char 变量名[ ]  = " 字符串值"

2.6.6.2.c++风格字符串

string 变量名 = " 字符串值"

用c++风格 需要包括 #include <string>

	char a[ ] = "hello world";
	string b = "hello world";
		 
	cout << a << endl;
	cout << b << endl;

2.6.7.布尔类型bool

作用:布尔数据类型代表真或假的值

bool类型只有两个值(内存只占一个字节大小):

  • true ---真(本质是1)
  • false ---假(本质是0)
	bool flag = true;
	cout << flag << endl;

	bool flag2 = 1;
	cout << flag2 << endl;

2.6.8.数据的输入

作用:用于从键盘获取数据

关键字:cin

语法:cin >> 变量

	int a = 2;
	cout << "输入a的值" << endl;
	cin >> a;
	cout << "a=" << a << endl;

三.运算符

作用:执行代码的运算

3.1.算术运算符

作用:处理四则运算

注意:

  1. 两个整数相除,结果依然为整数,小数部分去除。
  2. 分母不为0。
  3. 10 % 20 =10
  4. 俩个小数不可以做 取模% 运算

3.1.1递增

前置递增-----------------------------先++后运算

先让变量 ++ ,然后再进行表达式运算。

	int a = 2;
	int b = 3;
	b = ++a * b;
	cout << "a=" << a << endl;
	cout << "a=" << b << endl;

后置递增-----------------------------先运算后++

先进行表达式运算,在让变量 ++

	int a = 2;
	int b = 3;
	b = a++ * b;
	cout << "a=" << a << endl;
	cout << "a=" << b << endl;

3.1.2递减

前置递减

先让变量 -- ,然后再进行表达式运算。

后置递减

先进行表达式运算,在让变量 --

3.2.赋值运算符

作用:将表达式的值赋给变量

3.3.比较运算符

作用:用于比较式的比较,并返回一个真值或假值

3.4.逻辑运算符

作用:用于根据表达式的值返回真值或假值

四.程序流程结构

三种程序运行结构:

  1. 顺序结构:程序按照顺序执行,不发生跳转
  2. 选择结构:依照条件是否满足,有选择的执行相应的功能
  3. 循环结构:依照条件是否满足,循环多次执行某段代码

4.1.选择结构

4.1.1 if语句

作用:执行满足条件的语句

三种形式

  1. 单行格式if语句
  2. 多行格式if语句
  3. 多条件的if语句
4.1.1.1 单行格式if语句:

	if (flag)
	{

	}
4.1.1.1.2多行格式if语句

	if (flag)
	{

	}
	else
	{

	}
4.1.1.1.3多条件的if语句

	if (flag)
	{

	}
	else if(flag2)
	{

	}
	else if (flag3)
	{

	}
	else
	{

	}

4.1.2三目运算符

作用:通过三目运算符实现简单的判断

语法: 表达式1 ? 表达式2 :表达式3

解释:

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果;

c++中三目运算符返回的是变量,可以继续赋值

	int a = 2;
	int b = 3;
	int c = 0;
	int d = 0;

	c = (a > b ? a : b);
	(a > b ? a : b) = 100;
	cout << "c=" << c << endl;
	cout << "b=" << b << endl;

4.1.3switch语句

作用:执行多条件分支语句

语法:

4.2.循环结构

4.2.1.while循环

4.2.2.do...while循环

4.2.3.for循环

4.3.跳转语句

4.3.1 break语句

4.3.2 continue语句

4.3.3 goto语句

作用:可以无条件跳转语句

语法:goto 标记;

解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置。

标记不需要被初始化。

五.数组

5.1一维数组

5.1.1一维数组定义

三种定义方式:

  1. 数据类型  数组名 [ 数组长度] ;
  2. 数据类型  数组名 [ 数组长度]  = { 值1 , 值2 ......};
  3. 数据类型  数组名 [ ] = { 值1 , 值2 ......};

数组元素下标从0开始索引的

	int arr[5];
	arr[0] = 99;
	arr[1] = 5;
	arr[2] = 56;

	int arr2[5] = { 2,6,3,4,5 };
	int arr3[] = { 2,6,3,4,5 };

5.1.2一维数组数组名

	int arr[5];
	cout << "整个数组占用空间大小" << sizeof(arr) << endl;
	cout << "每个元素占用空间大小" << sizeof(arr[0]) << endl;
	cout << "数组元素个数" << sizeof(arr)/ sizeof(arr[0] )<< endl;
	cout << "数组首地址" << arr << endl;
	cout << "数组首地址" << int(arr) << endl;
	cout << "数组第一个元素首地址" << &arr[0] << endl;
	cout << "数组第一个元素首地址" <<int( & arr[0]) << endl;

5.2二维数组

5.2.1二维数组定义方式

四种方式:

  1. 数据类型  数组名 [ 行数 ]  [ 列数 ];
  2. 数据类型  数组名 [ 行数 ]  [ 列数 ] = { {数据1,数据2} ,{数据3,数据4} };
  3. 数据类型  数组名 [ 行数 ]  [ 列数 ] = { {数据1,数据2 ,数据3,数据4 };
  4. 数据类型  数组名 [          ]  [ 列数 ] = { {数据1,数据2 ,数据3,数据4 };
	int arr1[2][2];
	arr1[0][0] = 0;
	arr1[0][1] = 0;
	arr1[1][0] = 0;
	arr1[1][1] = 0;

	int arr2[2][2] = 
	{   
		{1,2},
		{3,4} 
	};
	int arr3[2][2] = { 1,2,3,4 };
	int arr4[ ][2] = { 1,2,3,4 };

5.2.2二维数组数组名

  • 查看二维数组所占空间
  • 获取二维数组首地址
		int arr2[2][2] = 
	{   
		{1,2},
		{3,4} 
	};


    cout << "二维数组空间大小" << sizeof(arr2) <<endl;
	cout << "二维数组第一行空间大小" << sizeof(arr2[0]) << endl;
	cout << "二维数组第一个元素空间大小" << sizeof(arr2[0][0]) << endl;
	cout << "二维数组行数" << sizeof(arr2) / sizeof(arr2[0]) << endl;
	cout << "二维数组列数" << sizeof(arr2[0]) / sizeof(arr2[0][0]) << endl;
	cout << "二维数组空间首地址" << arr2 << endl;

六.函数

6.1概述

6.2定义

6.3调用

6.4值传递

6.5函数常见样式

4种样式

  1. 无参无返
  2. 无参有返
  3. 有参无返
  4. 有参有返
//无参无返
void tset1(void)
{

}
//调用 : tset1();

//无参有返
int tset2(void)
{
	return 0;
}
//调用 : tset2();

//有参无返
void tset3(int a)
{

}
//调用 : tset1(200);

//有参有返
int tset4(int a)
{
	return a;
}
//调用 : tset4(200);

6.6函数的声明

6.7函数的分文件编写

1.第一步在头文件处新建项选择头文件.h,并且填好名称

2.第二步在源文件处新建项选择c++文件.cpp,并且填好与头文件相同的名称

3.在头文件.h中添加一些引用的头文件和函数声明

#include <iostream>
using namespace std;
#include <string>

void hanshu(int a, int b);

4.在源文件.cpp中添加引用头文件.h的语句外加函数的定义

#include "02.h"


void hanshu(int a, int b)
{
	int temp;

	temp = a + b;

}

七.指针

7.1概念

作用:通过指针间接访问内存

  1. 内存编号从0开始记录,一般用16进制数字表示
  2. 可以利用指针变量保存地址

7.2定义和使用

语法:数据类型  *   变量名

	int a = 10;
	//定义为指针后存放的是一个地址
	int * p;

	//让p存放a的地址
	p = &a;
	cout << "a地址为" << &a << endl;
	cout << "p为" << p << endl;

	//对p所指定的地址中存放的一个东西做出改变,需要解引用
	*p = 500;
	cout << "a为" << a << endl;
	cout << "p为" << p << endl;

7.3所占用的内存空间

在32位操作系统下,指针是占用4个字节空间大小,不管定义的是什么类型。

在64位操作系统下,指针是占用8个字节空间大小,不管定义的是什么类型。

	cout << "int *   \t " << sizeof(int*) << endl;
	cout << "float * \t  " << sizeof(float *) << endl;
	cout << "long long *\t " << sizeof(long long*) << endl;

7.4 空指针和野指针

空指针:指针变量指向内存中编号位0的空间

用途:初始化指针变量

空指针指向的内存不可以访问

	//        NULL = 0
	int * p = NULL;

野指针:指针变量指向非法的内存空间

7.5const修饰指针

const修饰指针有三种情况:

  • const修饰指针 --常量指针
  • const修饰常量 --指针常量
  • const既修饰指针,也修饰常量

7.5.1常量指针

在指针前面添加const ,即为常量指针

注意:指针的指向可以修改,但是指针指向的值不可修改

const修饰的是*,所以解引用后的值不可以修改

	int a = 10;

	const int* p = &a;

7.5.2指针常量

const  放在数据类型  *     与变量名  中间,

即     数据类型  * const 变量;

注意:指针的指向不可以修改,但是指针指向的值可以修改

const修饰的是b,所以指向不可以修改

	int* const b = &a;

红色为不可以指向

7.5.3const既修饰指针,也修饰常量

前面与中间均有const

注意:指针的指向和指向的值都不可以修改

	const	int* const b = &a;

红色为不可以指向和修改

7.6指针和数组

作用:利用指针访问数组中的元素

数组与指针的类型要对应,指针在32位操作系统占用4个字节,存放的是数组的地址,当要让指针++也就是存放的地址++,会根据存放数组类型大小(占用的是几个字节)进行++,而不是根据指针类型大小进行++。

	double arr[10] = {1,2,3,4,5,6,7,8,9,10};

	double* p = arr;//arr就是数组首地址

	cout << "第1个元素 " << *p << endl;
	p++;
	cout << "第2个元素 " << *p << endl;

指针遍历数组

	double arr[10] = {1,2,3,4,5,6,7,8,9,10};

	double* p = arr;//arr就是数组首地址

    for (int i = 0; i < 10; i++)
	{
		cout << *p << endl;
		p++;
	}

7.7指针和函数

作用:利用指针做函数的参数,可以修改实参的值

void transmit(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//调用
transmit(&num1,&num2);

7.8指针,函数,数组

arr 是一个指向整数数组的指针。指针是一种变量,它存储的是另一个变量的地址。通过指针,我们可以间接地访问和修改变量的值。

数组名本质上是指向数组第一个元素的指针,因此在访问数组元素时不需要解引用。在函数 bort 中,通过指针 arr 可以直接访问和修改变量的值,从而实现冒泡排序算法。

当使用 arr[j] 时,实际上是通过指针间接访问数组的元素。

void bort(int *arr,int length)
{
	for (int i = 0; i < length - 1; i++)
	{
		for (int j = 0; j < length - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j +1];
				arr[j +1] = temp;
			}
		}
	}
}
	int arr[10] = {2,2,8,9,66,22,11,0,7};
	int length = sizeof(arr)/ sizeof(arr[0]);
//调用
	bort(arr, length);

八.结构体

8.1概念

用户自定义的数据类型,允许用户存储不同的数据类型

九.类和对象

C++面向对象的三大特征为:封装,继承,多态

C++认为万事万物都皆为对象,对象上有其属性和行为

9.1封装

9.1.1封装意义

9.1.1.1封装意义一

类中的属性和行为,统一称为成员

属性又称为成员属性,成员变量

行为又称为成员函数,成员方法

#include <iostream>
using namespace std;
#include <string>
#include "02.h"


double pi = 3.14;
//class代表设计一个类,类后面紧跟着的是类名称
class circle
{
	//访问权限
	//公共权限
public:

	//属性--通常是一个变量
	//半径
	int m_r;

	//行为--通常是一个函数
	//获取圆的周长
	double calculatezc()
	{
		return 2 * pi * m_r;
	}

};

int main()
{
	//通过圆类,创建具体的圆(对象)
	circle c1;
	//给圆对象的属性进行赋值
	c1.m_r = 20;
	cout << "周长:   " << c1.calculatezc() << endl;

	system("pause");
	return 0;
}
class student
{
public:
	int id;
	string name;

	string express()
	{
		return name;
	}
	int express1()
	{
		return id;
	}
	void show()
	{
		cout << "姓名: " << name <<  "   学号: " << id << endl;
	}

	void setname(string Name)
	{
		name = Name;
	}
};
	student s1;
	s1.id = 1008;
//	s1.name = "秋水";
	s1.setname("秋水");
//	cout << "姓名:"<<s1.express() << endl;
	///cout << "学号:" << s1.show() << endl;

	s1.show();
9.1.1.2封装意义二

class person
{
public:
	//公共权限
	string Name;
protected:
	//保护权限
	string Car;
private:
	//私有权限
	int PassWord;

public:
	void func()
	{
		Name = "李三";
		Car = "问界";
		PassWord = 123654;
	}

};
int main()
{
	person p1;
	p1.Name = "张三";	
	system("pause");

	return 0;
}

9.1.2 struct与class区别

9.1.3成员属性设置为私有

#include <iostream>
using namespace std;
#include <string>
#include "02.h"


class person
{
public:
	void setname(string name)
	{
		Name = name;
	}
	string getname()
	{
		return Name;
	}
	int getage()
	{
		return age;
	}
	void setage(int aage)
	{
		if (aage < 0 || aage >120)
		{ 
			cout << "年龄输入有误" << endl;
			return;
		}
		age = aage;
	}
	void sercar(string carnamr)
	{
		Car = carnamr;
	}

	//私有权限
private:
	string Name;//可读可写
	string Car;//只写
	int age = 20;//只读,可写限制范围
};



int main()
{
	person p1;
	p1.setname("李三");
	p1.sercar("理想");
	p1.setage(200);
	cout << "姓名 : " << p1.getname() << endl;
	cout << "年龄 : " << p1.getage() << endl;

	system("pause");

	return 0;
}

9.2对象的初始化和清理

9.2.1构造函数和析构函数

class person
{
public:
	//构造函数
	person()
	{
		cout << "构造函数" << endl;
	}
	//析构函数
	~person()
	{
		cout << "析构函数" << endl;
	}
};

9.2.2构造函数的分类即调用

9.2.3拷贝构造函数调用时机

9.2.4构造函数调用规则

9.2.5深拷贝与浅拷贝


class person
{
public:
	//构造函数
	person()
	{
		cout << "构造函数" << endl;
	}
	person(int aage)
	{
		age = aage;
		cout << "有参构造函数" << endl;
	}
	//析构函数
	~person()
	{
		cout << "析构函数" << endl;
	}
	//私有权限

	int age = 20;
};

void tsst()
{
	person p1(18);
	cout << "年龄 : " << p1.age << endl;

	person p2(p1);
	cout << "p2年龄 : " << p1.age << endl;
}

int main()
{
	tsst();
	system("pause");

	return 0;
}

9.2.6初始化列表

#include <iostream>
using namespace std;
#include <string>
#include "02.h"


class person
{
public:
	//传统初始化操作
	 /*
	person(int a,int b ,int c)
	{
		ma = a;
		mb = b;
		mc = c;
	}
	*/
	//初始化列表初始化属性
	person(int a, int b, int c) : ma(a), mb(b), mc(c)
	{
	
	}
	//析构函数
	~person()
	{
		cout << "析构函数" << endl;
	}
	//私有权限


	int ma;
	int mb;
	int mc;
};

void tsst()
{
	//person p1(2,3,50);
	person p1(30,10,0);
	cout << "ma=" << p1.ma << endl;
}

int main()
{
	tsst();
	system("pause");
	return 0;
}

9.2.7类对象作为类成员

9.3继承

9.3.1继承基本语法

语法:class 子类   : 继承方式   父类

子类也成为派生类

父类也成为基类

#include <iostream>
using namespace std;
#include <string>
#include "02.h"


class base
{
public:
	void header()
	{
		cout << "首页,登录" << endl;
	}
	void content()
	{
		cout << "视频" << endl;
	}
	void left()
	{
		cout << "下载,浏览" << endl;
	}
};

//java页面
class java :public base
{
public:
	void content()
	{
		cout << "java视频" << endl;
	}

};
//python页面
class python :public base
{
public:
	void content()
	{
		cout << "python视频" << endl;
	}

};
void tset()
{
	java j1;
	j1.content();
	j1.header();

	python p1;
	p1.content();
	p1.header();
	p1.left();
}
int main()
{
	tset();

	system("pause");

	return 0;
}

9.3.2继承方式

9.3.3继承中构造和析构顺序

9.3.4多继承语法

十.MFC基本应用程序

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值