C++短跑回顾

        本文只是以5天时间超快地学完C++后,为了让自己不忘记,而写下的脑中的记忆.可能有误的,大家不要轻信.如发现错误,,还麻烦告诉我一声.

        运算符重载,操作数只能是类,系统先检查操作数是不是系统默认的(如果是+,则检查是不是int float...),不是刚检查员有没有对这个操作符重载.
         b是a的派生,b * p = &b,p指向的是基类头部.

函数的重载:
根据参数的个数、类型来决定使用哪一个函数体。这些函数是同名的,不能根据函数的返回值来判定使用哪一个函数体。

重载

// practice.cpp : 定义控制台应用程序的入口点。
//

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

void myMax(int a,int b)
{
 cout<<"int a b"<<endl;
}
void myMax(float a , float b)
{
 cout<<"float a b"<<endl;
}
void myMax(int a,float b)
{
 cout<<"int a float b"<<endl;
}
void myMax(float a ,int b )
{
 cout<<"float a ,int b"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
// myMax(5.5,3);  对重载函数的调用不明确
// myMax(5.5,5);  对重载函数的调用不明确

 myMax(3,4);
// myMax(3.3,3.2);  对重载函数的调用不明确
 return 0;
}

 

上面的C++程序,编译会出错,提示“对重载函数的调用不明确”。可能是因为直接用数值来做为形参,系统难以辨认。可改为先定义某一类型变量,然后用变量来做形参,代码如下:

 

用变量做形参重载

// practice.cpp : 定义控制台应用程序的入口点。
//

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

void myMax(int a,int b)
{
 cout<<"int a b"<<endl;
}
void myMax(float a , float b,float c)
{
 cout<<"float a b c"<<endl;
}
void myMax(int a,float b)
{
 cout<<"int a float b"<<endl;
}
void myMax(float a ,int b,int c )
{
 cout<<"float a ,int b,int c"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 float fa,fb,fc;
 int ia,ib,ic;
 cin>>fa>>fb>>fc>>ia>>ib>>ic;
 myMax(fa,ia,ib);
 myMax(3,4);
 myMax(fa,fb,fc);
 return 0;
}

 

 


 

函数模板:

 

模板

// practice.cpp : 定义控制台应用程序的入口点。
//

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

template <typename Ti,typename Tj> //模板只能在全局部分定义

void myMax( Ti a, Tj b)
 {
  if( a > b) cout<<"a>b"<<endl;
  else cout<<"a<b"<<endl;
 }

int _tmain(int argc, _TCHAR* argv[])
{

 float fa;
 int ia;
 cin>>fa>>ia;
 myMax(fa,ia);
 return 0;
}

 



有默认参数的函数:

 

 

标题

// practice.cpp : 定义控制台应用程序的入口点。
//

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


int _tmain(int argc, _TCHAR* argv[])
{
 void printabc(int ,int  ,int = 888 );  //此处不能省略对默认参数的赋值,可以用" int = 888  "
 printabc(3,4,5);
 printabc(11,22);
 return 0;
}
void printabc(int a,int b,int c) //此处不能省略形参名,得是能省略对默认参数的赋值
{
 cout<<a<<b<<c;
}

 


 

string类型的变量可以直接用> < ==等来比较

 


 

类外定义成员函数:

 

标题

// practice.cpp : 定义控制台应用程序的入口点。
//

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

class myClass
{
public:                                //如不没有声明是public还是private还是protected,则默认是private,如果要在MAIN中使用,一定要用public,不要忘记了!
 void printfSTH(int a);
};                                     //一定不要忘记了这个
void myClass::printfSTH(int a)
 {
  cout<<"a = "<<a;
 }

int _tmain(int argc, _TCHAR* argv[])
{
 myClass myObj;
 myObj.printfSTH(34);
}

 


 

构造函数:
      构造函数不能有返回值类型。

 

参数初始化列表对数据成员初始化

// practice.cpp : 定义控制台应用程序的入口点。
//

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

class myClass
{
public:   
 myClass(int a);
 int b;
};                                    
myClass::myClass(int a):b(a)  //参数初始化列表对数据成员初始化只能用在构造函数中,且被初始化的变量只能是基类的成员。
 {
//  int b ;  如只在此处定义b,则会了错,提示b不是基类成员
  int c  = a;
  cout<<"a = "<<a;
  cout<<endl<<"b = "<<b<<endl;
  cout<<"c = "<<c;
 }

int _tmain(int argc, _TCHAR* argv[])
{
 myClass myObj(88520);
}

 


 

const 型数据的小结

形式 含义
 Time const t1;t1是常对象,其值在任何情况下都不能改变 
 void Time::fun()constfun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员 
 Time * const p; p是指向Time 对象的常指针,p的值(即p的指向)不能改变
 const Time * p; p 是指向Time类常 对象的指针其指向的类对象的值不能通过指针来改变
 Time &t1 = t;t1是Time类对象t的引用,二者指向同一段内存空间 

反正,const后来整体是常型,不能改变。

 


 

类,构造函数,析构函数

当没有主动去停用一个类时,这个类在整个程序结束时才被释放,也就是说,在整程序结束时才执行 所有的析构函数。

标题

// practice.cpp : 定义控制台应用程序的入口点。
//

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

class myBaseClass
{
public:
 myBaseClass();
 ~myBaseClass();
 int a,b;
};

myBaseClass::myBaseClass()
{
 cout<<":::::::::myBaseClass start:::::::::::"<<endl;
}
myBaseClass::~myBaseClass()
{
 cout<<":::::::::myBaseClass end:::::::::::"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 myBaseClass const myConstObj;
 // myConstObj.a = 3;   值指定常数对象 --不能对用CONST定义的常对象赋值
 myBaseClass myObj;
 myBaseClass * p = &myObj;
 p->a = 33;        //此处只能用“->”而不能用  p.a,可能对指针只能用 -> 吧
 cout<<"p->a = "<<p->a<<endl;
}

 

友元函数

// practice.cpp : 定义控制台应用程序的入口点。
//友元函数

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

class myBaseClass
{
public:
 myBaseClass();
 ~myBaseClass();
 int a,b;
friend void pengyou( myBaseClass & t );     //必须有类做为参数
private:
 int pa,pb;
};

void pengyou( myBaseClass &t )
{
 cout<<t.pa<<endl;
}

myBaseClass::myBaseClass()
{
 cout<<":::::::::myBaseClass start:::::::::::"<<endl;
}
myBaseClass::~myBaseClass()
{
 cout<<":::::::::myBaseClass end:::::::::::"<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 myBaseClass myObj;  //必须有实例化了的对象
 pengyou(myObj);
}


 

友元成员函数

// practice.cpp : 定义控制台应用程序的入口点。
//

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


class Date;
class Time
{
public:
 Time(int,int,int);
 void display(Date &);
private:
 int hour;
 int minute;
 int sec;
};

class Date
{
public:
 Date(int,int,int);
 friend void Time::display(Date &);
private:
 int month;
 int day;
 int year;
};

Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){}

void Time::display(Date &d)
{
 cout<<d.month<<"/"<<d.day<<"/"<<d.day<<"/"<<d.year<<endl;
}
Date::Date(int m,int d,int y):month(m),day(d),year(y){}


int _tmain(int argc, _TCHAR* argv[])
{
 Time t1(10,13,56);
 Date d1(12,23,2004);
 t1.display(d1);

 return 0;
}

 

友元函数

// practice.cpp : 定义控制台应用程序的入口点。
//

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


class Date;        //提前声明
class Time
{
public:
 Time(int,int,int);
 void display(Date &);
private:
 int hour;
 int minute;
 int sec;
};

class Date
{
public:
 Date(int,int,int);
 friend Time;                  //友元类的使用
private:
 int month;
 int day;
 int year;
};

//Time类的构造函数
Time::Time(int h,int m,int s):hour(h),minute(m),sec(s){}

void Time::display(Date &d)
{
 cout<<d.month<<"/"<<d.day<<"/"<<d.day<<"/"<<d.year<<endl;
}
//Date类的构造函数
Date::Date(int m,int d,int y):month(m),day(d),year(y){}


int _tmain(int argc, _TCHAR* argv[])
{
 Time t1(10,13,56);
 Date d1(12,23,2004);
 t1.display(d1);

 return 0;
}

 

模板类


// practice.cpp : 定义控制台应用程序的入口点。
//

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

template <class myType1>
class myClass
{
public:
 myClass(myType1 a)
 {
  x = a;
  cout<<a<<endl;
 }
private:
 myType1 x,y;
};

int _tmain(int argc, _TCHAR* argv[])
{
myClass <int> myClass1(3323);     //切记切记,一定要加上<int>指明变量类型,要不会出错

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值