(总结)C++与java比较教程--7.1 声明和定义和初始化(待补充)

原创 2012年03月29日 18:14:17


1.什么时候声明同时也是定义,什么时候只是声明?


 相同点:

      C++和java中使用一个标识符之前必须对其进行声明.但是标识符的声明和定义不是一回事儿.

      定义是指分配了内存空间.


不同点:

     C++中只是声明而非定义的示例如下:

      extern int error_num;   //使用外部变量的声明

      class Student;     //类的前向声明(不完整声明)

      double d( double );  //被调用函数的声明 

   

    C++中大多数情况下声明的同时进行了定义(即分配了内存空间),无论是全局变量还是局部变量,还有对象的数据成员. 

      int j; 

      int count = 1;      //声明,定义,初始化为一体.

     string s;      //C++创建对象的时候既声明又定义,当然其成员也会定义.但是进行类类型的声明时不会分配内存.

   

     Java中声明是否同时为定义有两种情况,如int a;

    (1).如果a为一个方法的局部变量(无初始值)的话,则其只是一个声明而非定义(即不分配内存).

        如果希望在声明一个局部变量的同时为其定义,则可以对其进行初始化.如int a = 1;

    (2),如果a为一个类的数据成员的话,则其既是声明又是定义(即分配内存).


    2,C++和Java中的变量是否在定义的时候进行了缺省初始化?


相同点:

     C++和Java中都存在对定义的变量进行初始化的机制,只是具有不同的规则,同时缺省初始化时都是将变量初始化为适当的0.


不同点:

    C++中只对于两种类型的数据作出缺省的初始化:

       (1).作为全局变量的基本类型.

       (2).具有一个无参构造函数的类类型的对象,会根据其无参的构造函数来进行缺省的初始化.

       

具体的规则是:

     整型   0 , 浮点型 0.0 , 布尔型 false (0) ,字符型 '\0' , 

     类类型   取决于其无参构造函数. 

 

说明1: 

       如果没有提供一个无参构造函数,此时有两种情况:

       (1).同时也没有其他的构造函数的话,系统会为类提供一个缺省的无参构造函数,虽然按照规则进行初始化,但是只进行了内存分配而不进行初始化,所以指针成员会出现垃圾信息.

       (2).同时定义了其他的构造函数,只是没有一个无参的构造函数,这是系统不会自动提供无参的构造函数,

此时 形如  类名 + 对象名;  这种方式将会出错. 

      

      如果一个类中包含了未初始化的const或者引用成员,系统将不会提供一个缺省的无参构造函数.只能提供一个自定义的无参构造函数进行显式地初始化.

 


    Java中变量在定义时的缺省初始化规则:


     只有一种情况:一个变量首次在函数的内部出现且没有为其赋予初始值的话(即为一个方法的局部变量(无初始值))都是声明而非定义.


      整型  0, 单精度 0.0f , 双精度 0.0 , 字符型 \ u0000, 布尔型 false (0), 对象引用 null.


    注意: 

      类名 + 对象 ;  在java中只是声明而不定义(分配内存空间),其值为null,不能直接使用.

      类名 + 对象 = new 类名(...); 才是声明和定义,分配内存空间,可以直接使用. 


C++的代码示例:

#include <iostream>
using namespace std;

//定义全局变量,被缺省初始化为适合的0
int iNum1;
bool bNum1;
char cNum1;
float fNum1;
double dNum1;

class CMyClass1
{
private:
	int m_i;
	int m_j;

public:
	CMyClass1()
	{    
		m_i = 10;
		m_j = 20;
	}
	
	CMyClass1(int i,int j)
	{
		m_i = i;	
		m_j = j;
	}
	void Show()
	{
		cout<< " m_i = " << m_i << endl;
		cout<< " m_j = " << m_j << endl <<endl;
	}
};

class CMyClass2
{
public:
	CMyClass2(int &x,int y,int z):m_x(x),m_y(y)
	{
      m_z = z;
	}
	void Show()
	{
		cout<< " m_x = " << m_x << endl;
		cout<< " m_y = " << m_y << endl;
		cout<< " m_z = " << m_z << endl;
	}

protected:

private:
	int & m_x;
	const int m_y;
	int m_z;
};

void main()
{	
   
	int iNum2;
	cout<< " iNum1 = " << iNum1 <<endl;
	cout<< " iNum2 = " << iNum2 <<endl << endl;

	bool bNum2;
	cout<< " bNum1 = " << bNum1 <<endl;
	cout<< " bNum2 = " << bNum2 <<endl << endl;

	char cNum2;
	cout<< " cNum1 = " << cNum1 <<endl;
	cout<< " cNum2 = " << cNum2 <<endl << endl;

	float fNum2;
	cout<< " fNum1 = " << fNum1 <<endl;
	cout<< " fNum2 = " << fNum2 <<endl << endl;

	double dNum2;
	cout<< " dNum1 = " << dNum1 <<endl;
	cout<< " dNum2 = " << dNum2 <<endl << endl;

	CMyClass1 myClass1;
	myClass1.Show();

	CMyClass1 myClass2();   //错误地调用了无参构造函数,其实是一个返回值类型为CMyClass的函数的声明
    //myClass2.Show();

	CMyClass1 myClass3(30,40);
	myClass3.Show();

    //CMyClass2 myClass4;

	int num1 = 1;
    CMyClass2 myClass5(num1,2,3);
    myClass5.Show();
}



   


C++ 声明,定义与初始化的基本概念

对于变量:官方的解释:声明一个变量只是将变量名标识符的有关信息告诉编译器,使编译器“认识”该标识符,但声明不一定引起内存的分配。而定义变量意味着给变量分配内存空间,用于存放对应类型的数据,变量名就是对...
  • chaipp0607
  • chaipp0607
  • 2017年03月01日 16:39
  • 1503

[初]C++ 的 声明&定义&初始化

在C++和Java中,我们在使用一个标识符之前必须对它进行声明。标识符的声明和标识符的定义并不是一回事(虽然绝大数情况下它们看起来并没有什么不同)。在声明中,除非我们为一个标识符分配了足够的内存,否则...
  • snailjava
  • snailjava
  • 2007年04月02日 11:42
  • 1822

C++变量 声明、初始化、定义

1、命名空间的using声明 2、标准库类型string 3、标准k
  • littledouble
  • littledouble
  • 2014年10月14日 21:03
  • 1650

C++ - 类的成员变量 声明顺序 与 初始化顺序 相同

类的成员变量 声明顺序 与 初始化顺序 相同 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23845027 类成员的默认...
  • u012515223
  • u012515223
  • 2014年04月16日 14:40
  • 2908

C++中类的声明与其成员函数的定义分离--以提高类的复用性

=================================开始=======================================     当一个类被多个程序使用时,一般将类的声明(...
  • u014131641
  • u014131641
  • 2016年04月10日 09:15
  • 1648

C++中,类和函数分开定义声明和实现的方法

test.hpp #include #include #include #include #include "test.hpp" using namespace std; onecl...
  • jishan7
  • jishan7
  • 2016年09月14日 17:19
  • 996

C语言中声明、定义和初始化的区别

此外,其声明用于说明变量的属性(主要是变量的类型),且可多次声明;而变量的定义除此以外还将引起存储器的分配,且只能定义一次。 注意:定义是一种特殊的声明。 int sp; double val[MAX...
  • Mark_meego
  • Mark_meego
  • 2015年05月02日 17:03
  • 5347

C++变量的声明和定义 终于搞明白了

1.变量的定义:变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 2.变量的声明:用于向程序表明变量的类型和名字。程序中变量可以声明多次,但只能定义一次。...
  • hudfang
  • hudfang
  • 2014年12月18日 09:39
  • 9424

Java中定义和声明的区别

Java中最基本的就是定义变量和声明变量。 定义和声明的区别: 声明是向编译器介绍名字-标识符。它告诉编译器这个函数或变量在某处可以找到,它的模样像什么。而定义是说:“在这里建立变量”或“在...
  • gloomysnow
  • gloomysnow
  • 2016年05月22日 16:50
  • 3563

c++模板函数声明和定义分离

转载至:点击打开链接 c++模板不支持分离编译, 把你模板类的声明和实现放到.h文件里面 。按照这个说的把.h和.cpp文件合并后,果然可以了。 但是为什么呢,为什么模板就不支持分离编译?...
  • petersmart123
  • petersmart123
  • 2016年09月24日 12:32
  • 1373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(总结)C++与java比较教程--7.1 声明和定义和初始化(待补充)
举报原因:
原因补充:

(最多只允许输入30个字)