C++第二天学习

时间:2020-12-23 20:53:45

回顾:
1.第一个C++程序
头文件
输入输出
名字空间 using namespace std;
扩展名
编译方式 g++

2.名字空间

3.结构、联合、枚举

4.字符串
标准库提供的表示字符串的类型string

5.bool
1 0

6.函数升级
函数重载
相同的作用域,函数名相同,但是参数表不一样

默认参数
1.默认参数一定要靠右
2.避免二义性
3.默认参数要写在声明中
7.动态内存分配
new/delete
1.按类型分配空间
2.在分配空间的同时就可以初始化

delete []p;


-----------------------------------------
1.引用
引用即别名
引用是一个已经定义了的变量的别名。
int a = 10;
int& ra = a;
声明一个引用的格式:
类型& 引用名=已定义的变量;
&:引用声明符,不是取地址
1.一个变量的引用,和它本身是同一个东西,只要改变一个,另一个也随之改变
2.引用最主要的用途是用来作函数参数
swap(a,b); a1 = a,b1 = b;
swap3(a,b); int &a1 = a,int &b1 = b ;
1.节省空间
2.提高效率

3.引用作来返回值

2.类和对象

现实世界: 类
哈士奇
电脑
...
类:是一组具有相同属性和行为的对象的抽象和描述。
抽象:将有关事物的共性归纳、集中的过程。

对象:
万物皆对象。object

在面向对象程序设计中:
类:将多个对象的共性提取出来,定义的一种新的数据类型
是对 对象的属性和行为的抽象和描述。
对象:类 类型的变量
int a ;

类和对象的关系:
类它是抽象的,不占用空间
对象是具体的,占存储空间
类是对象的抽象,对象是类的具体的实例

在面向对象程序设计,总是先声明类,然后再由类生成其对象。

学生:
struct student
{

int num;
string name;
int age;
};

class student
{

int num;
string name;
int age;

void sleep();
void eat();
void study();
};

gg=G
3.结构体与类
1.为了照顾C程序员,所以在C++结构体尽量还是按照C风格来写
2.类比结构体更安全

区别:
结构体在默认情况下,它的成员都是公有的,在任何地方都可以访问
类在默认情况下,它的成员都私有的,在类的外部不能访问。


4.访问限定符
private: 私有的 只有在类的内部可以访问
public: 公有的 在类的内部和外部都可以访问
protected: 受保护的 只在类的内部和其子类可以访问


一般情况下,数据成员私有化,成员函数应该设为公有。

5.类的声明:
class 类名
{
public:
//公有成员(一般为函数)
private:
//私有成员(一般都是数据成员)
protected:
//受保护的成员
};

练习:
写一个类,其功能就是找出一个整型数组元素的最大值。
int array[5] = {1,2,3,4,5};


6.类的组织形式
1.声明一个类 应用放在头文件中
2.实现一个类 用一个.cpp文件来实现类
返回类型 类名::函数名(参数表)
{}
3.使用这个类


7.构造函数
构造函数主要用于为对象分配空间进行初始化。
构造函数是一种特殊的成员函数
构造函数的名字与类名要完全相同
构造函数没有返回值
构造函数在创建对象的时候 由系统自动调用,一定会调用,且只调用一次。
当我们在类中没有显式的声明构造函数时,编译器自动会创建一个构造函数,称为默认构造函数。
类名(参数表)
{}
一旦显式的声明了构造函数,系统不会再自动创建了。
构造函数也可以重载,也可以带默认参数

8.析构函数
在对象销毁时,自动调用,处理对象的善后工作。
最常用的用法:就是用来回收内存。
delete xxx
~类名()
{

}
析造函数也是一种特殊的成员函数
析构函数的名字是 ~类名
析构函数没有参数(意味着一个类里只能有一个析构函数)
由系统自动调用
析构函数也没有返回值


9.对象的创建与销毁
1.在栈中创建对象
类名 对象(构造函数参数);
Student s(参数);
2.在堆中创建对象
//int *p = new int;
类名 *对象指针名 = new 类名(构造实参);
student *s = new student;

3.在栈中创建对象数组
//int a[5];
类名 对象数组名[元素个数];

4.在堆中创建对象数组
int *p = new int[元素个数];
类名 *对象指针名 = new 类名[元素个数];

用new 创建的对象 一定要用delete 释放


练习: 实现一个电子时钟类
在构造函数中接收当前系统时间,以秒为单位运行
类的属性:时,分,秒
类的方法:构造函数
运行函数
对时间进行处理的函数
./myClock
17:13:50

int main()
{
MyClock c(...);
c.run();
return 0;
}

time(0);//获取系统时间,返回的是从1970年1月1日0点0分0秒到现在所经过的秒数
localtime();//把time得到的秒转为本地时间

 

 

#include<iostream>
using namespace std;
 
int main()
{
	int a = 10;
	int &ra = a;
	cout << "ra = " << ra << endl;//10
	a = 20;
	cout << "ra = " << ra << endl;//20
	ra = 30;
	cout << "a = " << a << endl;//30
	cout << "&a = "<< &a << endl;//
	cout << "&ra = "<< &ra << endl;//
	return 0;
}

 

 

#include<iostream>
using namespace std;
 
void swap(int a1,int b1)//交换不成功
{
	int temp;
	temp = a1;
	a1 = b1;
	b1 = temp;
}
 
void swap2(int *a,int *b)//使用指针作为参数,容易出错
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void swap3(int &a1,int &b1)//使用引用作为参数
{
	int temp;
	temp = a1;
	a1 = b1;
	b1 = temp;
}
int main()
{
	int a = 10;
	int b = 20;
//	swap(a,b);
//	swap2(&a,&b);
	swap3(a,b);
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	return 0;
}




#include<iostream>
using namespace std;
int& func(int& ra)
{
	ra = ra + 1;
	return ra;
}
int func2(int a)
{
	return a;
}
int main()
{
	int a = 10;
//	int r = func(a);
//	cout << "r = " << r << endl;
 
	int r2 = func2(a);//r2 = 10
	return 0;
}




#include<iostream>
using namespace std;

class student
{
public:
void sleep()
{
cout << "I am sleeping....." << endl;
}
// void eat();
// void study();
void show()
{
cout << num << endl;
cout << name << endl;
cout << age << endl;
}
private:
int num;
string name;
int age;

};

int main()
{

student s;
/*
s.num = 1001;
s.name = "zhangfei";
s.age = 20;

s.show();
s.sleep();
*/
return 0;
}

 

 

#include<iostream>
using namespace std;
 
class Test
{
	public:
		Test()
		{
			p = new int(100);
			cout << "Test()" << endl;
		}
		void show()
		{
			cout << "p = " << *p << endl;
		}
		~Test()
		{
			delete p;
			cout << "~Test()" << endl;
		}
	private:
		int *p;
};
 
int main()
{
	Test t;
	t.show();//Test()
 
	cout << "----------------" <<endl;
	Test *t1 = new Test;//Test()
	delete t1;//~Test()
 
	cout << "----------------" <<endl;
		//~Test()
	return 0;
}




#include<iostream>
using namespace std;

class array_max
{
public:
/*
array_max()
{
max = 0;
arr = NULL;
arrSize = 0;
cout << "这里是默认构造函数" << endl;
}

array_max(int m)
{
max = m;
cout << "这是带参数的构造函数"<< endl;
}
*/
array_max(int m = 0)
{
max = m;
arr = NULL;
arrSize = 0;
cout << "这里有默认参数的构造函数" << endl;
}
~array_max()
{
cout << "这里是析构函数" << endl;

}

void getArray(int *p,int size)
{
arr = p;
arrSize = size;
}
void init()
{
max = 0;
arr = NULL;
arrSize = 0;
}
int findMax()
{
max = arr[0];
for(int i = 0; i < arrSize; i++)
{
if(arr[i] > max)
{
max = arr[i];
}
}
return max;
}

private:
int max;
int *arr;
int arrSize;
};

 

int main()
{
int arr[5] = {1,2,3,4,5};
array_max arrMax(100);
array_max a1;
// arrMax.init();//初始化
arrMax.getArray(arr,5);
int r = arrMax.findMax();
cout << r << endl;
return 0;
}