直接说与 java 的不同点:
一、结构体
结构体也相当于把几种数据类型组合起来。结构体是值类型,赋值时会直接复制。
定义方式:
1、
struct
int
};
注意定义完必须有分号,在使用前定义。
2、
struct stu{
int
}stu1,stu2[20]; //声明同时定义变量 stu1、数组 stu2
3、没有类型名,只需要下面直接定义的俩变量
struct {
char* name;
} temp1,temp2;
通过 temp1.name 可以取到 name。
4、声明变量时
struct stu var1;
int
// 5、在main里也能定义(想象成内部类就OK)
struct
int
char
3]{{5,"s"},{23}},cba[]{2,"s"};
//相当于直接 ba abcd[3]{5,"s",23};
//!!结构体类型的变量在内存中依照其成员的顺序排列,所占内存空间的大小是其全体成员所占空间的总和(有详细的占用空间规则,目前不需要知道)
// 编译时,仅对包含的变量分配空间,
int length =sizeof(stu);
//length = 4
stu
name =10;
ba b{10,"wocao"
ba cc{20};
cc = b;
// 同类型的结构体变量之间可以直接赋值。这种赋值等同于各个成员的依次赋值,这个性质产生了结构体与类的区别:类是引用传递,结构体是值传递!!!值传递!!
// 结构体变量的指针
ba
id =100;
//p->num和(*p).num等价:
id =1000;
/*
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
(1)用结构体变量名作参数,将实参值传给形参,一般较少用这种方法(时间和空间开销大)。
(2)用指向结构体变量的指针作实参,将结构体变
量的地址传给形参。
(3)引用变量。放到类里面说,都一样的
*/
二、共用体
不同的数据类型使用同一存储区域,即同一存储区域由不同类型的变量共同表示。这种数据类型就是共用体。
定义:
几个特点:
其实共用体存在的原因是 以前电脑内存小,每一点内存都得充分利用,有人就想出来这个方法。。。来让一块内存存更多东西。现在真的是不需要了。。所以共用体的知识可以略过 个人觉得真没用了
看看下面的图demo,能不能看懂共用体的精髓:公用一块区域 观察a的值、内存变化
java里只能定义在类里,这个没要求。
坑爹的是 C++还是得在使用前定义。。学java的好不习惯啊==
enum
变量:
weekday day = (weekday)2;//day是tue
weekday week =weekday::sun;
if
cout<<day<<endl;//输出的是序号
day = week;
}
四、typedef 定义类型名 而已
typedef 已定义的类型 新的类型 :
//typedef:编译时处理,定义一个类型替代原有的类型。
double REAL;
REAL bd =12.1;
typedefstruct
int
} STRUC ; //还记得上面的 #define STRUCT struct stu吗,这个其实和那个一样的==
STRUC
name =10;
pp = &a;
typedefchar
CHAR_P char1,char2 ="dasdaw";
// 重点看看下面这个定义:
typedefchar STRING[80];
STRING
// 定义过程:
也可以想成: typedef int I 定义 int 是I;则定义长度100的int数组是: typedef int[100] IN
但是C++数组不允许这样(java数组可以这样。。。)所以改成 typedef int IN[100] ----
最后说明:
}
五、 类 。
protected限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数
不加标志符就是默认 private,而结构体类型成员的默认权限是public
在定义类时,只是定义了一种数据类型,即说明程序中可能会出现该类型的数据,并不为类分配存储空间。只有在定义了属于类的变量后,系统才会为类的变量(对象)分配空间
class A
{ float x, y;
public:
voidSetxy(floata,float b)
{ x=a; y=b; }
类中直接定义的函数体,如果很简单,在编译时自动作为内联函数来实现
void Print(void)
{ cout<<x<<‘\t’<<y<<endl; }
}a1,a2;
可以把方法定义在外面,类里面只声明方法(让类的成员一目了然):
class A{
float x, y;
public:
voidSetxy(floata,float b);
void Print(void);
};
void A::Setxy(floata,float b)
{ x=a; y=b; }
void A::Print(void)
{ cout<<x<<‘\t’<<y<<endl; }
类外定义的函数体,加inline,有可能在编译时作为内联函数来实现//详细见我内联函数那一节
提醒一下 ->这个符号最常用,但是学java的习惯用 .
但是!!!这里的 . 不是和java一样的,先看demo:
class
public
int
void
cout<<name;
}
};
void fuck(stu
name =100;
}
void fuck1(stu& s1){
name =100;
}
int
stu
name =10;
fuck(s);
cout<<s.name<<endl;
(由于还没说到 new运算符,现在先用 & 符号)
stu
fuck1(s1);
cout<<s1.name<<ends;
输出 10 100 原因是 C++的引用类型变量 是 stu & s ;也就是说 上面两个fuck函数里,只有一个传的是引用(指针),才能修改原对象的域。
}
类的基础东西就先说到这 下节说类的其他东西