`
ekumen
  • 浏览: 105357 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c++ unit3

    博客分类:
  • c++
阅读更多
1. 函数传递的参数是从右向左计算各个参数表达式的值.
2. 禁止传值调用可以把拷贝构造函数设置为private 或 protected
3. 类的非静态成员函数指针用法
#include  <iostream>
class A{
public:
  int   RetInt()   {return   100;}
};
class  B{
public:
int (A::*pFun)(void);
void  Print(A &obj){
  int val =  (obj.*pFun)();
  std::cout << "Val = " << val << std::endl;
}
};
int  main(){
  A   a;
  B   b;
  b.pFun   =   &A::RetInt;
  b.Print(a);
}
note: 1.  (obj.*pFun)()       2. &A::RetInt  此处必须显示使用取地址.
4.就算参数不同的同名函数处于不同的作用域,内部作用域会屏蔽外部作用域同名的函数.
5.全局作用域使用::  例如 ::fun();
6.内联汇编  如:
_asm{
        lea eax,A::print
        mov v,eax
}
7.
A ReturnObject(){
A a;
return a;
}
int main(){
PTR p;
/*会运行错误
p=reinterpret_cast<PTR>(ReturnObject);
p();
*/
/* 下面的运行正确 */
p=reinterpret_cast<PTR>(ReturnInt);
p();
}
因为返回的对象较大时,主调函数会在栈上创建临时对象接收返回值,强行转换会导致内存泄露. 返回较小体积的时候,直接存放在寄存器中.
8.
#include <iostream>
int main(){
int i;
std::cout << "please input a number:";
std::cin >> i;
return i;
}
编译成Test.exe
.bat文件内容
@echo off
Test
if %errorlevel% == 3 echo third
if %errorlevel% == 2 echo second
if %errorlevel% == 1 echo first
pause
可以获取返回值
9.在函数声明和函数定义中,对参数默认值只能指定一次
10. 参数个数可变实现
void PrintAll(int n1, ...){
int *ptr;
ptr = &n1;
while(*ptr){
  cout << *ptr << endl;
  ptr++;
}
}
标准方法:
int SqSum1(int n1, ...){
va_list arg_ptr;/* 定义保存函数参数的结构 */
int nSqSum=0,n=n1;
va_start(arg_ptr, n1);// 使用宏va_start, 使argp指向传入的第一个可选参数,
while (n > 0){
  nSqSum += (n * n);
  n = va_arg(arg_ptr, int);//取出当前的参数,类型为int,如果不给出正确的类型,将得到错误的参数
}
va_end(arg_ptr);/* 将argp置为NULL */
return nSqSum;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics