第一次看了c++,发现和java还是有很多的不同的。在这里列举出一点点自己找到的c++看到的概念,做一个总结。
可变参数
形参实参
typedef
指针变量的运算
指向函数的指针
引用
引用传递参数&指针传递参数
指针数组
如何引用结构体
类的新建与方法调用与构造函数
构造函数与析构函数的调用环境
双重指针**
可变参数
va_list va_start va_arg va_end
示例demo:
#include<iostream>
#include<stdarg.h>
using namespace std;
void OutputInfo(int num,...)
{
va_list arguments; //定义一个va_list类型变量
va_start(arguments,num);
while(num--) //读取所有参数的数据
{
char* pchData=va_arg(augrments,char*); //获取字符串数据
int iData=va_arg(arguments,int);
cout<<pchData<<endl;
cout<<iData<<endl;
}
va_end(arguments); //将不再使用的指针变为null
}
void main()\
{
OutputInfo(2,"BeiJing",2008,"Olympic Games",2008);
}
//最后输出
BeiJing
2008
Olympic Games
2008
1. va_list:一个可变参数的数据类型。
1. va_list arguments;
2. va_start:有两个参数,一个是va_list,一个是参数当前读取参数。
1. va_start(arguments ,num);
2. num--表示读取往后一个变量
形参实参
形参:在函数被声明和定义时被定义的就叫做形参
实参:在函数被调用时具体赋的值就叫实参
形参实参的区别:
1. 在定义函数时指定的形参在还没有进行函数调用时是不占内存。在被调用之后所占内存也随着销毁
2. 实参应该是确定的值。在调用时将实参的值赋给形参。如果形参是指针类型,就将地址值传递给形参
3. 实参形参的数据类型应该相同
4. 实参和形参之间是单项传递,只能有实 参传递给形参
typedef
1 首先://注意在C和C++里不同
在C中定义一个结构体类型要用typedef:
typedef struct Student
{
int a;
}Stu;
于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明)
这里的Stu实际上就是struct Student的别名。Stu==struct Student
另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是Stu stu1;)
typedef struct
{
int a;
}Stu;
但在c++里很简单,直接
struct Student
{
int a;
};
于是就定义了结构体类型Student,声明变量时直接Student stu2;
2.其次:
在c++中如果用typedef的话,又会造成区别:
struct Student
{
int a;
}stu1;//stu1是一个变量
typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型=struct Student
使用时可以直接访问stu1.a
但是stu2则必须先 stu2 s2;
然后 s2.a=10;
指针变量的运算
指针变量的运算是对指针的地址进行运算。int 的地址每个占4个字节,double的地址每个占8个字节
对指针变量进行运算之后取值是取得到的地址上的值
#include <iostream>
using namespace std;
int main()
{
int a = 100;
int *p = &a;
printf("p的地址为:%d\n", p);
printf("p的值为:%d\n", *p);
printf("--------------------------------\n");
p++;
printf("p的地址为:%d\n", p);
printf("p的值为:%d\n", *p);
printf("--------------------------------\n");
p--;
printf("p的地址为:%d\n", p);
printf("p的值为:%d\n", *p);
printf("--------------------------------\n");
p--;
printf("p的地址为:%d\n", p);
printf("p的值为:%d\n", *p);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
double a = 100.0;
double *p = &a;
printf("p的地址为:%d\n", p);
printf("p的值为:%f\n", *p);
printf("--------------------------------\n");
p++;
printf("p的地址为:%d\n", p);
printf("p的值为:%f\n", *p);
printf("--------------------------------\n");
p--;
printf("p的地址为:%d\n", p);
printf("p的值为:%f\n", *p);
printf("--------------------------------\n");
p--;
printf("p的地址为:%d\n", p);
printf("p的值为:%f\n", *p);
return 0;
}
指向函数的指针
#include <iostream>
#include<iomanip>
using namespace std;
int avg(int a,int b);//定义一个函数
int main()
{
int a, b, r;
a = 10;
b = 30;
int(*f)(int, int);//新建函数指针
f = avg;//指向一个函数
r = (*f)(a,b);
printf("r = %d",r);
return 0;
}
int avg(int a, int b)//函数的实现
{
return (a+b)/2;
}
引用
引用是一种隐式指针,为对象建立一个别明年,通过&进行实现。调用这个引用相当于调用被引用对象自己一样。
#include <iostream>
#include<iomanip>
using namespace std;
void main()
{
int a;
int &ref_a = a;
a = 100;
cout << "a=" << a << endl;
cout << "ref_a=" << ref_a << endl;
a = 2;
cout << "a=" << a << endl;
cout << "ref_a=" << ref_a << endl;
int b = 20;
ref_a = b;
cout << "a=" << a << endl;
cout << "ref_a=" << ref_a << endl;
ref_a--;
cout << "a=" << a << endl;
cout << "ref_a=" << ref_a << endl;
}
引用传递参数&指针传递参数
函数的参数传递方式有两种,一种是值传递,一种是引用传递。
值传递是把值直接传入到调用函数中。这样不会改变原有值。
引用传递是把引用方式传递进入,效果与值传递刚好相反。会引起原始值的改变。
指针传递参数的效果与引用传递参数一样。
#include <iostream>
#include<iomanip>
using namespace std;
void swapp(int &x, int &y)//引用传递
{
int temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int a,b;
cout << "intput two number " << endl;
cin >> a;
cin >> b;
if (a<b)
{
swapp(a,b);
}
cout << "a= " << a << endl;
cout << "b= " << b << endl;
}
#include <iostream>
#include<iomanip>
using namespace std;
void swapp(int *x, int *y)//指针传递
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void main()
{
int a,b;
int *p_a, *p_b;
cout << "intput two number " << endl;
cin >> a;
cin >> b;
p_a = &a;
p_b = &b;
if (a<b)
{
swapp(p_a, p_b);
}
cout << "a= " << a << endl;
cout << "b= " << b << endl;
}
指针数组
指针数组存储的是一系类的指针集合,其元素是指向指针的指针。
想要取得指针数组里面元素的值,只需要对其进行两次取值就可以。例如**p;
如何引用结构体
有两种方式,一种是 ->
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;
void main()
{
struct PersonInfo
{
int index;
char name[32];
short age;
} pInfo;
pInfo.index = 0;
pInfo.age = 20;
strcpy(pInfo.name, "张三");
cout << "index= " << pInfo.index << endl;
cout << "name= " << pInfo.name << endl;
cout << "age= " << pInfo.age << endl;
}
另一种是 ->
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;
void main()
{
struct PersonInfo
{
int index;
char name[32];
short age;
}*pPersonInfo, pInfo = {0,"张三",20};//可直接生成一个指针变量,也可以在定义时直接赋值直接赋值。
//指针变量需要在初始化之后才可使用
pPersonInfo = &pInfo;
//指针变量的引用方式 ->
cout << "index= " << pPersonInfo->index << endl;
cout << "name= " << pPersonInfo->name << endl;
cout << "age= " << pPersonInfo->age << endl;
}
类的新建与方法调用与构造函数
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<iomanip>
using namespace std;
/****新建的类需要放在调用或者新建的那个地方的前面。如若放在后面就会引用不到。报错*/
class CPerson
{
public:
CPerson();
~CPerson();
CPerson(int index, short shAge, double dSalary);
int iIndex;
short m_shAge;
double m_dSalary;
int getIindex();
short getAge();
double getSalary();
private:
};
CPerson::CPerson()
{
iIndex = 0;
m_shAge = 10;
m_dSalary = 1000;
}
CPerson::~CPerson()
{
}
CPerson::CPerson(int index, short shAge, double dSalary)
{
iIndex = index;
m_shAge = shAge;
m_dSalary = dSalary;
}
int CPerson::getIindex()
{
return iIndex;
}
short CPerson::getAge()
{
return m_shAge;
}
double CPerson::getSalary()
{
return m_dSalary;
}
void main()
{
CPerson p1;//默认无参构造函数,声明是自动调用
cout << "index= " <<p1.getIindex() << endl;
CPerson p2(1,20,1000);//有参构造函数,声明时需要给定参数
cout << "index= " << p2.getIindex() << endl;
p2 = p1;
cout << "index= " << p2.getIindex() << endl;
}
构造函数与析构函数的调用环境
1. 自动变量的作用域是某个模块,当此模块被激活时调用自动变量构造函数,,当退出此模块时会调用析构函数
2. 全局变量在进入main函数之前会调用构造函数。在程序终止时会调用析构函数
3. 动态分配的对象在使用new为对象分配的时候调用构造函数,使用delete删除对象的时候调用析构函数
4. 临时变量是为了支持计算,油编译器自动产生。临时变量的生存周期起始和终止会调用够着函数和析构函数
双重指针**
双重指针,就是一个指针存储的地址指向的也是一个指针。
给个例子:
int number;//这是一个普通的变量
int *p2n=&number;//这是一个指针,他存储的地址是变量number的地址,通过这个地址,可以定位到number这个变量
int **p2p=&p2n;//这是一个指针的指针,他存储的地址是指针变量p2n的地址,通过他,可以确定p2n这个指针bianliang。
void **pp1 = (void **)&aa;//void 是指,这个变量pp1存储的地址,不确定一个具体的类型,你可以在必要的时候使用(类型 **)的方式进行类型转换。