Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181915
  • 博文数量: 64
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 616
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-09 20:25
文章分类

全部博文(64)

文章存档

2016年(25)

2015年(39)

我的朋友

分类: C/C++

2016-02-17 18:33:57

一、class成员默认私有,struct成员默认公有
#include
using namespace std;


class CPoint
{
int x;
void print()
{


}
public:
CPoint(int x,int y)
{
this->x = x;
this->y = y;
}
void print1()
{


}
};




struct Spoint
{
int x;
int y;
void printf()
{


}
Spoint(int x, int y)
{
this->x = x;
this->y = y;
}
private:
void print1()
{


}
/* data */
};


int main()
{
CPoint cpt(1,2);
Spoint spt(3,4);
cout<< cpt.x<< cpt.y; //error
cpt.print();  //error
cpt.print1();


cout<< spt.x < spt.print();  
spt.print1(); //error
}

在类的继承方式上,struct和class的区别是class继承默认是私有继承,struct继承默认是公有继承。以private方式继承父类的子类对象不能访问父类的public成员。
同时,class可以用于表示模板类型,而struct不行。
二,类中的两个构造函数,一个带参数,一个不带参数,调用不带参数的构造函数时,是不需要小括号的。
struct Test
{
Test(int){}
Test(){}
void fun(){}
};
void  main(void)
{
Test a(1);
a.fun();
Test b();//error应为Test b;
b.fun(); 
return 0;
}
三、类对象的私有成员函数不能用对象访问
四、初始化列表的初始化顺序与变量声明的顺序一致,而不是按照出现在初始化列表中的顺序,这里成员i比成员j先声明,因此正确的顺序是先用j对i进行初始化,然后用2对j初始化,由于在对i进行初始化时,j值为随机值,所以i也是随机值,然后用2对j进行初始化,j的值为2
#include
using namespace std;
 class Obj
 {
 public:
  Obj(int k):j(k),i(j)
{



void print(void)
{
cout< }
private:
int i;
int j;
  /* data */
 };
 int main(int argc, char const *argv[])
{
Obj obj(2);
obj.print();
return 0;
}
五、静态成员时一个类的全局变量,对于非静态成员,每个类对象都有自己的复制品,而静态成员对每个类的类型只有一个复制品,静态成员只有一份,该类类型的所有对象共享访问。
#include
using namespace std;
class Myclass
{
public:
Myclass(int a, int b, int c);
void GetNumber();
void GetSum();
private:
int A;
int B;
int C;
int Num;
static int Sum;


};


int Myclass::Sum = 0;


Myclass::Myclass(int a, int b, int c)
{
A = a;
B = b;
C = c;
Num = A+B+C;
Sum = A+B+C;
}


void Myclass::GetNumber()
{
cout<<"Number = "<
void Myclass::GetSum()
{
cout<<"Sum = "< {
Myclass M(3,7,10),N(14,9,11);
M.GetNumber();
N.GetNumber();
M.GetSum();
N.GetSum();
}
六、和全局对象相比,使用静态数据成员有什么好处
1.静态数据成员没有进入程序的全局名字空间,因此不存在程序中其他全局名字的冲突的可能
2.使用静态数据成员可以隐藏信息,因为静态成员可以是private成员,而全局对象不能
七、有几种情况只能使用初始化列表,不能使用赋值,当类中含有const、reference成员变量和基类的构造函数时都需要初始化列表

使用构造函数初始化列表初始化数据成员,没有定义初始化列表的构造函数体重对数据成员赋值。
对于const和reference类型成员变量,它们只能够被初始化而不能做赋值操作,因此只能用初始化列表
类的构造函数需要调用其积累的构造函数的时候,以下代码可以解释,如果在子类的构造函数中需要初始化父类的private成员,直接对其赋值是不行的,只能调用父类的构造函数才能完成对它的初始化。但在函数体内调用父类的构造函数是不合法的,只能采用初始化列表调用子类构造函数的方式

#include
using namespace std;
class A
{
private:
int a;
public:
A(){}
A(int x):a(x) {}
void printA()
{
cout<<"a = "<

class B : public a
{
private:
int b;
public:
B(int x, int y): A(x)
{
//a=x;    //a为private,无法再子类中被访问,编译错误
//A(x);   //调用方式错误,编译错误
b=y;
}
voud printB()
{
cout<< "b = "<

int main()
{
B b(2,3);
b.printA();   //调用子类的printA
b.printB();  //调用自己的printB
return 0;
}

八、静态成员函数访问
九、全局对象的构造函数会在main函数之前执行
十、c++的空类会产生哪些成员函数
    1、默认构造函数和赋值构造函数,他们被用于类的对象的构建过程
    2、析构函数,他被用于类的对象的析构过程
    3、赋值函数,他被用于同类的对象间的赋值过程
    4、当对类的对象进行取地址&时,此函数被调用
阅读(1108) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~