C++ 02从简单程序引入1


//#define BASIC1_COUT
//#define BASIC1_CIN
//#define BASIC_CLASS1
//#define BASIC_STRING_SORT
//#define BASIC_STRING_SEARCH
//#define BASIC_NEW_DELETE
//#define BASIC_REFERENCE		//引用
//#define TEMPLATE_FUNCTION    //模板函数
#define FUNCTION_OVERLOADING    //函数重载

/************************************
1、对象
【1】对象一般由属性attribute和行为behavior构成,对象之间通过传递消息联系。
【2】C++中,对象由数据和函数组成,数据体现属性,函数体现行为,又称为方法method;调用对象的函数就是向对象传递消息message。
【3】设计复杂的软件系统时,首要的问题就是确定系统由哪些对象组成。

2、封装和信息隐蔽
【1】对象的部分属性和行为封装,对外界隐蔽,既可以降低操作难度,同时有利于数据安全。
【2】设计对象的过程就是在封装,对象之间互相独立,互不干扰,同时对象内部也要考虑到封装。
----
1】私有数据和公用接口:一般指定所有数据私有和外界隔离,通过公用成员函数作为接口实现对数据操作。
2】接口与实现的分离:成员函数对数据成员操作称为实现,但与调用无关的部分都封装不让改变称为私有实现;公用接口和私有实现构成信息隐蔽。
3】信息隐蔽的优点:方便类修改和扩充,只需修改有关部分;
3、抽象abstraction
抽象就是将有关事物的共性归纳、集中的过程,表示同一类事物的本质。类是对象的抽象,而对象时类的特例。

4、继承与重用
两个类基本相同,后者只需在前者基础上增加一些新内容,就是面向对象的继承机制。
软件重用 software reusability,利用现成的类。

5、多态性
继承产生的不同类的对象,对同一个消息会做出不同的响应。

6、内置函数: inline function; 编译时会将所调用的函数代码直接嵌入到主函数中,提高效率。
1]使用方法:函数名的最左端加上inline;
2]使用限制:只将语法简单,规模很小而且很频繁使用的函数声明为内置函数。
3]类体内定义的成员函数如果不包括循环等控制结构,C++系统会自动将它们作为内置函数来处理,隐含指定,这点区别于其他inline内置函数。
类体外定义的成员函数,要通过Inline作声明才能成为内置函数。

7、成员函数存储方式
1]对象的数据存储单元存放的数据各不相同,但调用的函数代码相同;对象的空间大小取决于数据单元,而函数代码存储在对象空间之外。
2]c++的this 用来指向不同对象。

8、引用对象成员
1].称为成员运算符,限定访问的对象成员或函数;还有对象的指针,对象的引用,三种访问对象成员的方法。每个类至少要有一个public函数。

9、类库和调用:
1]类的声明放在头文件,类的定义/实现放在.obj。
只需编译一次行程obj,需要的时候直接用来连接即可。若干类的声明集中在一起,形成类库,包括编译系统的标准类库和自定义类库。
2]类库一般状态C++编译系统的子目录下,程序包含类声明头文件即可调用。
************************************/

//站在用户的角度考虑,输入输出界面要亲切友好。
//函数重载
#ifdef FUNCTION_OVERLOADING


#include <iostream>

using namespace std;

int max(int a, int b, int c);  //同名函数的重载,必须函数参数的个数或类型不同。
int max(int a, int b);		   //重载的同名函数功能需要相同或相近,不同做不相干的功能。

/*
int max(int a, int b, int c);
double max(double a, double b, double c);
*/

int main(int argc, char *argv[])
{
	int a = 8; 
	int b = -23;
	int c = 28;

	cout<<"max(a,b) = "<<max(a, b)<<endl;   //函数名相同,参数个数和函数体不一样。
	cout<<"max(a,b,c) = "<<max(a, b, c)<<endl;

	system("pause");
	return 0;
}

int max(int a, int b)
{
	if (a > b)	
	{
		return a;
	}
	else
	{
		return b;
	}
}

int max(int a, int b, int c)
{
	if (b > a)
	{
		a = b;
	}
	if (c > a)
	{
		a = c;
	}
	return a;
}


#elif defined TEMPLATE_FUNCTION

#include <iostream>

using namespace std;

//适用于函数体相同,参数类型一样而类型不同的情况。
//使用方法:template <typename T> 下面再跟上函数的定义
//返回3个参数中的最大值
template <typename T>
T max(T a, T b, T c)  //模板声明,T为虚拟类型名;函数自适应传入的参数类型
{
	if (b > a)
		a = b;
	if (c > a)
		a = c;
	return a;
}

int main(int argc, char * argv[])
{
	int i1 = 185;
	int i2 = -76;
	int i3 = 456;
	int i =0;

	double d1 = 34.5;
	double d2 = 43.5;
	double d3 = 45.6;
	double d;

	long g1 = 1234;
	long g2 = 321;
	long g3 = 354;
	long g;

	i = max(i1, i2, i3);  //调用模板函数,系统根据参数的类型来取代模板虚拟类型。
	d = max(d1, d2, d3);
	g = max(g1, g2, g3);

	cout<<"i_max = "<<i<<endl;
	cout<<"d_max = "<<d<<endl;
	cout<<"g_max = "<<g<<endl;

	system("pause");
	return 0;
}


#elif defined BASIC_REFERENCE   //引用主要是用来作为函数参数传递数据,变量名作为实参传递。

#include <iostream>
#include <iomanip>        //输出控制符setw的头文件

using namespace std;

void changeValue(int &x, int &y);

int main(int argc, char* argv[])
{
	int a = 10;
	int &b = a;          //声明b是a的引用,所以b和a是同一个变量,a变了b也跟着变,反之亦然,两者共享同一个内存单元。
	int c = 50;			 //声明引用的同时,必须要初始化。

	a = a * a;
	cout<<a<<setw(6)<<b<<endl; //紧接着的输出操作使用的字段宽度设置,包括输出内容本身的宽度
	b = b/5;
	cout<<b<<setw(6)<<a<<endl;
	 if(b!=c)
	 {
		 changeValue(b, c);    //引用作为形参,变量传入以后,形参改变则变量也跟着改变。
		 cout<<"b="<<b<<setw(6)<<"c="<<c<<endl;
	 }

	system("pause");
	return 0;
}

//互换x和y的值 swap  //引用做参数的效果,相当于传递变量的指针,但更直接。
void changeValue(int &x, int &y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}


///
#elif defined BASIC_NEW_DELETE
//new和delete是运算符不是函数,执行效率高。
//格式:new 类型 [初值] => float *p=new float(3.14); int *pt = new int [5][4];new分配数组空间时,不能指定初值。
//格式: delete[]指变 ; delete p;   delete []pt;

#include <iostream>
#include <string>

using namespace std;

struct student
{
	string name;
	int num;
	char sex;
};

int main(int argc, char *argv[])
{
	student *p;
	p = new student;  //new运算符开辟一个存放student型数据的空间,返回的指针赋给p
	p->name = "zhang";
	p->num = 130;
	p->sex = 'm';

	cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;
	delete p;		  //用delete运算符撤销该空间,不需要p=NULL;

	system("pause");
	return 0;
}


//班级里N个学生,把每个学生的姓名和学号输进计算机。通过输进一个学生的姓名查找相关资料。
//查找到此生,输出其姓名和学号;查不到,则输出“查无此人”。
#elif defined BASIC_STRING_SEARCH

#include <iostream>
#include <string>

using namespace std;

int g_studentIndex = 0;
string g_studentName[50];    //string 全局数组不能初始化为0?
string g_studentNum[50];

void InputStudentName();
void SearchStudentName(string findName);

int main(int argc, char *argv[])
{
	string findName;

	cout<<"Please input the number of this class:"<<endl;
	cin>>g_studentIndex;
	InputStudentName();
	cout<<"Please input name you want find:";
	cin>>findName;
	SearchStudentName(findName);

	system("pause");
	return 0;
}

void InputStudentName()
{
	for (int i=0; i<g_studentIndex; i++)
	{	
		cout<<"input name and number of student "<<i+1<<":";
		cin>>g_studentName[i]>>g_studentNum[i];
	}
}

void SearchStudentName(string findName)
{
	bool flag = false;
	for (int i=0; i<g_studentIndex; i++)
	{
		if (findName == g_studentName[i])
		{
			cout<<g_studentName[i]<<"has been found, number is  "<<g_studentNum[i]<<endl;
			flag = true;
			break;
		}
	}

	if (flag == false)
		cout<<"Can't find this name"<<endl;

}



//输入3个字符串,按字符串字母由小到大顺序输出。
//string类型,字符串类型;是在C++标准库中的字符串类,可以用来定义对象。
//赋初值:string str1 = "china";
//直接赋值: str1 = "zhang";  str2=str1; //strcpy
//操作字符串的字符:  string word="then"; word[2]='a';
//字符串常量,以'\0'结尾,但存储到变量中不包括'\0'。
//cin>>str1;
//字符串变量运算:str1=str2+str3; //连接   比较:直接用==,>
//字符串数组: string name[3] ={"i","love","you"};  //长度可变,元素是字符串;每一个字符串元素中只包含字符串本身字符而不包含\0.

#elif defined BASIC_STRING_SORT

#include <iostream>
#include <string>			//string字符串

using namespace std;

int main(int argc, char* argv[])
{
	string string1;
	string string2;
	string string3;
	string temp;

	cin>>string1>>string2>>string3;

	if (string2 > string3)    //字符串交换; 字符串直接赋值
	{
		temp = string2;
		string2 = string3;
		string3 = temp;
	}
	if (string1 < string2)
		cout<<string1<<" "<<string2<<" "<<string3<<endl;
	else if (string1 > string3)
		cout<<string2<<" "<<string3<<" "<<string1<<endl;
	else
		cout<<string2<<" "<<string1<< " "<<string3<<endl;

	return 0;
}



//
#elif defined BASIC_CLASS1

//C++把一组数据和调用数据的函数封装在一起,组成一种称为“类”的数据结构。
//类有两种成员,包括数据成员和成员函数。
class student     //类的声明
{
public:           //公用成员函数
	void setData();
	{
		cin>>num;  //cin对应的是变量,不需要地址.
		cin>>score;
	}
	void display()
	{
		cout<<"num"<<num<<endl;
		cout<<"score"<<socre<<endl;
	}

private:				//私有变量,只有本类的成员函数才能调用,实现数据封装和信息隐蔽的目的。
	int num;
	int score;
};

student stud1,stud2;

int main()
{
	stud1.setData();    //.成员运算符,调用对象的函数。
	stud2.setDate();
	stud1.display();
	stud2.display();
}


//
#elif defined BASIC1_CIN

#include <iostream>
using namespace std;

int main()
{
	int a = 0;
	int b = 0;
	int sum = 0;

	cin>>a>>b;                    //标准库的输入流对象,>>是提取运算符。键盘输入两次数据后各按回车确认。
	sum = a + b;             
	cout<<"a+b="<<sum<<endl;      //endl输出回车; cout 自适应输出格式,不需要printf的格式输出。

	return 0;
}
//流,是指来自设备或传给设备的一个数据流,数据流是由一系列字节组成的,按字节进入流的顺序排列。
//cout<<"表达式1"<<...<<"表达式n";   //系统会自动判别输出数据的类型
//cin>>变量1>>……>>变量n;     //用空格或者回车隔开,系统会根据变量类型从输入流中提取相应长度的字节
//cin 不能输入回车和空格,要用getchar;

#elif defined  BASIC1

//C的头文件要加.h后缀,C++的头文件可加可不加。
#include <iostream>					//iostream代表输入输出流。输入输出流库中的流对象cin和cout.
using namespace std;				//“使用命名空间std”。 //C++标准库中的类和函数是在std中声明的,程序如需要用到标准库(cout)要用此语句做声明。

int main()							//标准C++规定,主函数main必须声明为Int,返回整型数据。
{
	cout <<"This is C++ program";  //cout为对象名,称为输出流对象。<< 插入运算符,将要输出的内容插入到输出流中。

	return 0;					   //向操作系统返回0值。如果程序不能正常执行,则会自动向操作系统返回一个非0值,一般是-1.
}

#endif





 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值