C++笔记_03面向对象4

//面向对象4,定义控制台应用程序的入口点


#include<iostream>
#include<string.h>
using namespace std;




#include"public.h"


/*类和对象*/






/*
初始化与赋值的区别


(c++)区别说明:赋值操作是在两个已经存在的对象间进行的,而初始化是要创建一个新的对象,
并且其初值来源于另一个已存在的对象。编译器会区别这两种情况,赋值的时候调用重载
的赋值运算符,初始化的时候调用拷贝构造函数。如果类中没有拷贝构造函数,则编译器
会提供一个默认的。这个默认的拷贝构造函数只是简单地复制类中的每个成员。


(c)http://blog.csdn.net/mhjcumt/article/details/7351032




*/






/*


函数返回值规则
    。。。。C和C++区别里面
区别为 1.小于等于4个字节,,,,2.小于等于8个字节怎么返  C语言中
C++ 中,   返回对象, 返回内置类型


返回值不可以引用,因为,寄存器没有地址




函数return的值 通过寄存器带出来,寄存器不会取地址,
*1* 返回值小于等于4个字节
函数执行完毕后,如果返回值小于等于4字节,则会将值保存在寄存器eax中,然后再调用函数中通过读取eax的值来获取返回值
*2* 返回值大小在[5,8]字节范围内
因为eax寄存器只有4个字节,所以,当返回值在[5,8]字节范围内时,
一般采用eax和edx联合返回的方式进行的。期中eax存储返回值的低4字节,edx存储返回值的高4字节。
*3* 返回值大于8个字节是
主调函数在其栈中的局部变量区域中额外开辟一片空间,将其一部分作为传递返回值的临时对象temp。
将temp对象的地址作为隐藏参数传递给被调函数函数。
被调函数函数将数据拷贝给temp对象,并将temp对象的地址用eax传出。
被调函数返回后,主调函数将eax指向的temp对象的内容拷贝给n。 


http://m.blog.csdn.net/wanna_wsl/article/details/70550825


*/


/*
返回内置类型的时候,产生的都是寄存器的立即数(也就是常量值)

返回自定义类型的时候,也是通过寄存器返回的 <=8 字节,,
但是指向引用的时候,编译器会自动产生临时量


返回对象的时候,一律产生临时量,并把临时量的地址作为实参传递进来,
被调用函数通过访问ebp+8就能访问 调用方 临时内存的地址


内置类型   
char short int long float double
char *  shor *  int *  long * float * double *
//const右边有*的话,const绝对不能丢
char &  shor &  int &  long & float & double &

自定义类型
struct union enum class没有构造       非对象类型的自定义类型
<=4
[4 ,8]
>=8


*/


int Getint()
{
int value = 10;
return value;
}


int main()
{
int val = Getint();


//int *val2 = &Getint();//error
//int &ret = Getint();   //1 2 3 4 5


//int *const &p = Getint();  //error


/*
这样讲哈,,,  
函数return之后的值是放在eax寄存器里面的,
并且由于器存器不能取地址,所以,指针取地址是无效的,
再者,想要引用返回值的话,有个方法就 const (例子:const int &ret = Getint() )
加const 会产生临时量,这个临时量可以取地址,例子中ret取地址后将临时量的内容保存到它里面。嗯哼,至于为什么会产生临时量,后续百度
(这个临时量是产生在函数调用之后)
*/


//汇编上, 返回指针和引用是一样的






return 0;
}






#if 0
typedef struct _Data
{
int data;
}Data;


class Test
{
public:
Test(Data val):mvalue(val){}
Data Getvalue(){return mvalue;}
/**/
Data Getvalue()const  {return mvalue;}
private:
Data mvalue;
};




int GetInt()
{
int data = 10;
return data;
}


Data GetData()
{
Data data = {10};
return data;
}






int main()
{
Data d1={20};
Test t1(d1);


Data a1 = t1.Getvalue();
//int &b1 = t1.Getvalue();//err 寄存器不能取地址
Data &b1 = t1.Getvalue(); 
const Data &c1 = t1.Getvalue();//加入const 会产生临时量,位于main的堆栈中
/*对象 返回 对象的时候 都会产生临时量*/


//const Test t2(20);


//int a2 = t2.Getvalue();
//const int &b2 = t2.Getvalue();






return 0;
}
#endif 


















#if 0
/*
普通的成员方法    this
1.调用的时候必须依赖一个对象
2.能访问私有和保护的成员
3.类的作用域


static的成员方法   无this
1.调用的时候不用依赖对象,不是thiscall
2.能访问私有和保护的static成员??(但是,只能访问不依赖对象的成员)
3.类的作用域




常成员方法:this的指向被修饰成const   const this
1.调用的时候必须依赖一个对象 
2.能访问私有和保护的成员
3.类的作用域 
***常对象【只能】调用常方法,常方法不能调用普通成员方法,可以调用static成员方法
常方法只能访问成员,不能修改成员
,***


*/








class Counter
{
public:
Counter():_counter(0)//,_number(0)
{
_number++;
}
/*
const int *  -> int *        err
int * -> const int *         ok
consst int * -> const int *  ok
*/




//_thiscall
void show(/*Counter *const this  */)
{
cout<<"counter:"<<_counter<<endl;
}


void show(/*cosnt Counter *const this  */)const//会与上面的函数构成重载
{
cout<<"counter:"<<_counter<<endl;
}


//_cdecl
static void showNumber() //不含有this指针,不需要对象  
{
cout<<"number:"<<_number<<endl;
}
private:
int _counter;
static int _number;//位于数据段 .data
};
int Counter::_number = 0;//静态成员的初始化就与对象就没关系了






int main()
{
//Counter *p = new counter();
//p->show();
//delete p;


Counter c1;
Counter c2;
Counter c3;


Counter::showNumber();


const Counter c5;//&c5 const Counter* const this
c5.show();//Counter *const this


return 0;
}


#endif


#if 0
typedef enum
{
EN_LOGIN = 1,
EN_REGISTER,
EN_EXIT
}ENType;




typedef void (CMenu::*PFUNC)();




typedef struct _FuncMap
{
int choice;
PFUNC pfunc;
}FuncMap;
//table driver
FuncMap gFuncMap[]=
{
{EN_LOGIN, &CMenu::Login},
{EN_REGISTER, &CMenu::Register},
{EN_EXIT, &CMenu::Exit}
};




void CMenu::Run()
{
int choice = 0;
int size = sizeof(gFuncMap)/sizeof(gFuncMap[0]);
while(_bRunning)
{
ShowLoginMenu();
cin>>choice;
getchar();


for(int i=0;i<size;++i)
{
if(choice == gFuncMap[i].choice)
{
(this->*gFuncMap[i].pfunc)();//通过函数指针调用函数,编译器不知道你调用的是哪个对象
}
}


}


}


void CMenu::Login()
{
cout<<"username:";
gets(_name);
cout<<"password:";
gets(_pwd);


if(_userDB.checkUser(_name,_pwd))
{
//登录成功
}
else
cout<<"login error!"<<endl;
}


void CMenu::Register()
{
cout<<"username:";
gets(_name);
cout<<"password:";
gets(_pwd);


if(_userDB.Query(_name))
{
_userDB.Register(_name,_pwd);
}
else
cout<<"name invalid!"<<endl;
}


void CMenu::Exit()
{
exit(0);
}




int main()
{
CMenu menu;
menu.Run();


return 0;
}
#endif


#if 0
class Node
{
public:
Node(int data = 0):madata(data),mpnext(NULL){}
private:
int madata;
Node *mpnext;


//友元类,,声明为友元类,友元类中的所有成员方法都可以访问该类中的私有以及公有成员变量
//友元的关系不能传递,,是单一的   CLink是Node的友元, CLink可以访问Node的成员,但是Node不能访问CLink的成员
//A和B是友元,B和C是友元,,,不能说A和C是友元,,,
friend class CLink;
};




class CLink
{
public:
CLink()
{
mphead = new Node;//会调用Node的构造函数
}
~CLink()
{
Node *pcur = mphead;
while(pcur != NULL)
{
mphead = mphead->mpnext;
delete mphead;
pcur = mphead;
}
}


void insertHead(int val)
{
Node *ptmp = new Node(val);
ptmp->mpnext = mphead->mpnext;
mphead->mpnext = ptmp;
}


void insertTail(int val)
{
Node *ptmp = new Node(val);
Node *pcur = mphead;
while(pcur->mpnext != NULL)
{
pcur = pcur->mpnext;
}
pcur->mpnext = ptmp;
}


void show()
{
Node *pcur = mphead->mpnext;
while(pcur != NULL)
{
cout<<pcur->madata<<" ";
}
cout<<endl;
}


private:
Node *mphead;


};








int main()
{
CLink link;




return 0;
}


#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学C面向对象程序设计期末考试题目会包括基本的面向对象思想、概念和编程技巧的考查。可能的考试题目包括以下方面: 1. 面向对象基础知识:这部分可能会包括面向对象的三大特性(封装、继承、多态)、类与对象的定义、对象的创建与使用、构造函数与析构函数等内容。考生需要理解面向对象的基本思想和原则,并能运用到实际编程中。 2. 类的继承与多态:这部分可能会涉及类的继承关系、继承关系下的构造函数与析构函数调用顺序、虚函数的概念及使用等。考生需要理解继承与多态的概念,并能编写具有继承与多态特性的程序。 3. 组合与聚合关系:这部分可能会涉及类与类之间的组合与聚合关系的理解和运用。考生需要能够分析问题,确定合适的关系并实现相应的程序。 4. 异常处理:这部分可能会涉及异常处理的概念、处理异常的机制、try-catch语句和throw关键字的使用等。考生需要了解异常处理的基本原理,并能编写具有异常处理机制的程序。 5. 设计模式:这部分可能会涉及常用的设计模式,如工厂模式、单例模式、观察者模式等。考生需要了解各种设计模式的概念、应用场景和实现方式。 在备考期末考试时,考生需要通过复习课堂笔记、教材和参考书,进行代码实践和编程练习,加深对面向对象程序设计的理解和掌握。同时,要注重理论与实践相结合,理解并能够解决实际问题,提高解决问题和设计程序的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值