1. 程式人生 > 其它 >C++的一些隨筆(第一篇)

C++的一些隨筆(第一篇)

C++中 ->的作用

->用於指標 ->用於指向結構體的指標 ->用於指向結構體的指標,表示結構體內的元素

#include<stdio.h>
struct role // 定義一個結構體
{
char name[8]; // 姓名
int level; // 等級
int HP; // 血量
int MP; // 藍量
int gold; // 金幣
};
void main()
{
struct role *w; // 定義一個結構體指標
char str[]="kuangzhan";
w->name = str; // 對結構體中的成員變數name進行賦值
w->level = 46; // 對結構體中的成員變數level進行賦值
w->HP = 3100; // 對結構體中的成員變數HP進行賦值
w->MP = 3100; // 對結構體中的成員變數MP進行賦值
w->gold = 475233; // 對結構體中的成員變數gold進行賦值
}

C++中 :: 的作用

呼叫變數

作用域::變數

如果a的作用域為全域性作用域,呼叫a時用

::a

如果a的作用域為類ww時,呼叫a時用

class ww
{
public:
int a();
}
int ww::a()//表示a是屬於ww的
{
return 0;
}

關於va_list, va_start, va_arg, va_end

由於在C語言中沒有函式過載,解決不定數目函式引數問題變得比較麻煩,即使採用C++,如果引數個數不能確定,也很難採用函式過載。對這種情況,提出了指標引數來解決問題。

如printf()函式,其原型為: int printf( const char* format, ...)

它除了有一個引數format固定以外,後面跟的引數的個數和型別是可變的,例如我們可以有以下不同的呼叫方法: printf( "%d ",i); printf( "%s ",s); printf( "the number is %d ,string is:%s ", i, s);

如何實現其功能?

我們需要以下幾個巨集定義:

(1)va_list 定義了一個指標arg_ptr, 用於指示可選的引數.

(2)va_start(arg_ptr, argN) 使 引數列表指標arg_ptr指向函式引數列表中的第一個可選引數,argN是位於第一個可選引數之前的固定引數, 或者說最後一個固定引數.如有一va函式的宣告是void va_test(char a, char b, char c, ...), 則它的固定引數依次是a,b,c, 最後一個固定引數argN為c, 因此就是va_start(arg_ptr, c).

(3)va_arg(arg_ptr, type) 返回引數列表中指標arg_ptr所指的引數, 返回型別為type. 並使指標arg_ptr指向引數列表中下一個引數.返回的是可選引數, 不包括固定引數.

(4)va_end(arg_ptr) 清空引數列表, 並置引數指標arg_ptr無效.

(注:va在這裡是variable-argument(可變引數)的意思. 這些巨集定義在stdarg.h中,所以用到可變引數的程式應該包含這個標頭檔案)

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
#include <stdarg.h>
void simple_va_fun(int i, ...)
{
va_list arg_ptr; /// 定義可變引數指標
va_start(arg_ptr, i); /// i為最後一個固定引數
int j = va_arg(arg_ptr, int); //返回第一個可變引數,型別為int
char c = va_arg(arg_ptr, char); ///返回第二個可變引數,型別為char
va_end(arg_ptr); ///清空引數指標
printf("%d %d %c", i, j, c);
return;
}

int main()
{
simple_va_fun(100);
cout << endl;
simple_va_fun(100, 200);
cout << endl;
simple_va_fun(100, 200, 'a');
cout << endl;
system("pause");
return 0;
}