您的位置:首页 > 编程语言 > C语言/C++

C++短跑回顾

2006-03-09 14:36 417 查看
本文只是以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>指明变量类型,要不会出错

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: