C++学习记录

本文介绍了C++的基础知识,包括HelloWorld程序、变量定义、常量对象、函数重载、内联函数、参数传递、内存管理和枚举。特别讨论了指针在交换变量值中的作用,以及构造函数和析构函数的概念。此外,还提到了类声明、对象引用以及this指针的相关概念。
摘要由CSDN通过智能技术生成

该文章用于边学习边记录,也是为了之后复习用。

Hello World!
#include<iostream>

int main(){
	std::cout<<"Hello,C++World!"<<std::endl;
	return 0;
} 

如果在头文件下插入语句

using namespace std;

程序相关名字就可以省略前面的std::。

定义变量的方式
  • 类型 变量
  • 类型 变量 = 表达式
  • 类型 变量(表达式)
  • 类型 变量{表达式} (c++ 11 新增)
  • 类型 变量列表

“类”是抽象的,不占用内存,而类的实例时具体的,要占用内存。

常量对象

绝大部分变量或对象在生存期内会发生变化,也有少量变量不会发生变化,C++引入 const关键字来表达这种情况。
看的时候可以将一个const和一个变量类型放在一起。

  • const int a = 100 # a不能改变
  • const int *p1 = &i #*p1的内容即(&i)不能改变,但p1指针的地址可以改变,只要保证它所指的内容不变
  • int *const p2 = &i # p2本身的地址不能变,但所指的内容可以改变
  • const int *const p3 = &j # 都不能变

若要传入常值引用,那么被调用的函数都要加上const确保不改变传入的内容。

函数重载

C++允许多个函数重名,但必须有不同的参数类型或者参数个数,引用时可以根据实参的个数和类型选择相应函数。

内联函数
inline int function()
提高运行速度,一般在头文件内,不可递归不可含循环
缺省参数值

如果在定义函数时就定义形参的值,那么引用时如果不传入实参那么就会用已经设置的默认值,也可以只传入前几个值,这样后面没有传入的值的参数会使用默认值。

参数传递
#include<iostream>
using namespace std;
	void swap1(int x,int y){
		int t;
		t=x;
		x=y;
		y=t;
	}
	void swap2(int *px,*py){
		cout<<&x<<endl<<&y<<endl;
		int *pt;
		pt=px;
		px=py;
		py=pt;
	}
	
	void swap3(int *px,int *py){
		cout<<&x<<endl<<&y<<endl;
		int t;
		t=*px;
		*px=*pt;
		*py=t;
	}
	void swap4(int &x,int &y){
		cout<<&x<<endl<<&y<<endl;
		int t;
		t=x;
		x=y;
		y=t;
	}
int main(){
	int x=3,y=5;
	//swap1(x,y);
	//swap2(&x,&y);
	//swap3(&x,&y);
	//swap4(x,y);
	cout<<x<<' '<<y;
} 
		
swap1结果:x=3,y=5; 只改变了形参,实参没有改变
swap2结果:x=3,y=5; 只改变了指针的地址,所指的内容并没有改变
swap3结果:x=5,y=3; 改变了指针所指的值,可以实现交换
swap4结果:x=5,y=3; 传入引用,直接改变,可以实现
动态分配和内存释放

内存泄漏:由于找不到使用的内存地址而造成该内存无法被访问到,造成内存丢失。程序在结束后会释放所有已申请的地址,但是如果是操作系统等长时间运行的程序,如果存在内存泄漏,若一直循环那么系统内存会被占用完毕,导致程序崩溃。

申请方法
T *p = new T(可初始化)
例如:
int *p1= new int(10)
int *p2 = new int[10]
int *p3 = new int[10 *10] #二维数组
Node *newnode = new Node

string *p1 = new string;
*p1 = “asdasd”;
cout<<*p1;

释放方法
delete p1;
delete[ ]p2; (p2 为数组)

枚举

enum 枚举名 {枚举元素1,枚举元素2,……};
若不赋值,那么默认第一个元素值为0,后面每项加一
e.g.

#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
 
int main()
{
    enum DAY day;
    day = WED;
    printf("%d",day);
    return 0;
}

常见数据结构

栈和队列,向量
#include<stack>
#include<queue>
#include<vector>   #去查操作
#include<iostream>
using namespace std;
stack <int> S;
queue<int> Q;
vector<int> A(n*n,0) # 直接申请了n*n大小的连续空间,并赋值为0;
int x;
Q.push(x);
S.push(x);

S.empty();
Q.empty();

S.top()  #栈顶元素
Q.front() #队首元素

类声明和类实现

类是现实世界或思维世界中的实体在面向对象程序设计中的反应。

class  CSet{
public:
成员函数,可以直接定义函数,也可以在类外定义函数内容

private:
私有成员数据
}

类的成员可以访问共有或私有成员,但从类外只能访问类的公有成员
成员函数体内可以访问当前对象的数据成员,也可以调用其他成员函数,甚至递归调用函数本省。
类的成员函数的实现也可以定义在类定义外,定义时要加上“类名::”

构造函数

类的对象建立时会自动调用类的构造函数。构造函数也是类的成员函数,构造函数的名字与类名相同,无返回值,也无返回类型void声明。构造函数也可以重载。 可以用来给私有成员赋初始值

如果没有提供构造函数,系统会自动合成一个无参构造函数(空语句)

析构函数

类对象消失时会自动调用析构函数,进行扫尾处理,可以用来释放动态分配的资源,没有动态分配则可以没有。
类的构造函数可以有多个,但是析构函数只有一个,名字为“~类名”,没有参数,返回值和返回值类型。

对象引用

大型对象的复制和赋值会产生大量的开销,传递引用开销比较小,省去了复制的时间和空间。

this 指针、类成员的作用域和生存期

普通类成员函数隐含this指针,指向当前对象。C++保证每个对象至少占一个字节的内存空间,任意时刻,不同对象的地址不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值