空指针常量

       用VB.NET 敲三层的时候,遇到了一个素未相识的错误:

       变量“DB”在赋值前被使用,可能会在运行时导致null引用异常

源自:

<span style="font-family:FangSong_GB2312;font-size:18px;"> Dim DB As  LoginModel.Dbutil 
 Using conn As New SqlConnection(DB.ConnString)</span>
这是数据访问层中ScoreDAO类中的代码,在UserDAO类中也有类似的代码:

<span style="font-family:FangSong_GB2312;font-size:18px;">Dim db As New LoginModel.Dbutil
Using Conn As New SqlConnection(db.ConnString)</span>
而且我把上面的这段代码复制到ScoreDAO中系统就不再提示该错误了;

Ctrl+F查找  该解决方案下所有的“DB”,也没有发现它有被使用过的痕迹,这是怎么回事?上网查吧

很快就找到了答案:


在这个回答的评论里有人说:把 dim dr As SqlDataReader 改为 dim dr as New SqlDataReader,亲测可用,这样问题解决了,但是为这是什么问题呢?文章被标题给出了答案:空指针常量。

   指针:   

   了解空指针之前先说说什么是指针吧。在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值指向存在存储器中另一个地方的值,即地址指向所需的变量单元将地址形象化的称为"指针";个人理解:指针起着一个“指引”的作用;不同的领域对指针也有着不同的定义,详解


指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的.使C语言程序的设计灵活、实用、高效;指针不仅仅是C语言的灵魂,运用得好更是事半功倍,让你写出的程序更简洁。

指针的值不能是整型值,但空指针是个例外,他的值可以是一个纯粹的零(并不必须是纯粹的零,但这个值是唯一有用的值。在编译时产生的任意一个表达式,只要它是零,就可以作为空指针的值,在程序运行时,最好不要出现一个为零的整型变量)。 

空指针:

它并不指向任何对象,空指针的值是NULL,NULL是一个纯粹的零,它可能会被强制转换成void*或char*类型。即NULL可能是0,0L或(void*)0等。有些程序员,尤其是C++程序员,更喜欢用0来代替NULL;而在一般的文档中倾向于用 NULL 表示,而没有直接说成 0。但是对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 "null pointer"(空指针)。一句话, 空指针就是一个被赋值为0的指针,在没有被具体初始化之前,其值为0.

NULL在C和C++的定义方式也不一样,甚至不同的编译器也有不同的要求,如:

define NULL 0 //C的定义方式 
define NULL (void *)0 //C++的定义方式

http://xyz64happy.blog.163.com/blog/static/9863967720081027838071/

网页问答上说这个空指针常量还关涉到自动装箱、自动拆箱这部分内容,本菜鸟表示不懂,但是先介绍一下再说:

自动拆装箱:

自动装箱:


   基本数据类型封装为对象类型。当我们创建一个Integer对象时,可以这样:Integer i = 100; (不是 int i = 100; )实际上执行该段代码的时候,系统为我们执行了:Integer i = Integer.valueOf(100);此即基本数据类型的自动装箱功能。基本数据类型不是对象,其没有可调用的方法。int t = 1;t.后面是没有方法的。Integer t =1; t.  后面就有很多方法可让你调用了。

自动拆箱(unboxing)


    也就是将对象中的基本数据从对象中自动取出int t = i; 实际上执行了 int t = i.intValue();
http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451996.html

引用:

    对已说明的变量来说,变量名就是对变量值的直接引用。对指向变量或内存中的任何对象的指针来说,指针就是对对象值的间接引用。如果p是一个指针,p的值就是其对象的地址;*p表示“使间接引用运算符作用于p”,*p的值就是p所指向的对象的值。

不妥之处欢迎交流。共同进步。

<think>好的,我现在需要回答用户关于C++11中nullptr关键字的问题。首先,我要回忆一下用户提供的引用内容,确保信息准确。 用户引用了三个资料,分别提到了nullptr的出现原因、与NULL的区别、类型转换特性以及解决函数重载问题。我需要整合这些信息,同结合自己的知识,给出清晰的结构。 首先,应该从历史背景开始,解释为什么C++11引入nullptr。C语言中的NULL在C++里可能导致类型问题,比如函数重载传递NULL可能被当作整数0而不是指针。引用[1]中的代码示例展示了这个问题,当调用f(NULL),实际调用的是f(int x)而不是指针版本。这候需要nullptr来解决歧义。 接下来,需要说明nullptr的定义和类型。根据引用[2],nullptr的类型是nullptr_t,可以隐式转换为任意指针类型,但不能转换为整型。这避免了将指针和整数混淆的问题。引用[1]中的第二个示例显示,int* p = nullptr是合法的,而int a = nullptr会报错,说明类型安全。 然后,讨论nullptr在函数重载中的应用。引用[3]的例子指出,使用NULL可能导致调用错误的函数,而nullptr能正确匹配指针版本的重载函数。这部分需要详细说明,以突出nullptr的优势。 另外,需要对比NULLnullptr的区别。比如NULL在C++中被定义为0,而nullptr是一个明确的空指针常量。类型转换方面,nullptr只能转为指针,不能转为整型,而NULL在C++中可能被当作0,导致潜在问题。 还要提到nullptr的类型安全性,比如不能隐式转换为整数,但可以转换为bool类型的false。引用[2]提到这些转换规则,确保代码更安全,减少错误。 最后,总结使用nullptr的好处,如提高代码可读性、避免潜在错误,并推荐在C++11及以上版本中使用nullptr替代NULL。 在回答结构上,应该分点阐述,每个部分用小标题,让用户容易理解。同,确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。不过当问题可能不需要数学公式,但要注意代码块的格式。 检查是否有遗漏的重要点,比如nullptr与其他类型的比较,或者与void*的转换问题。引用[1]中提到C++不允许将void*隐式转换为int*,而nullptr可以隐式转换为任何指针类型,这也是一个关键点。 确保回答中引用正确,比如在解释函数重载问题引用[1]和[3],在类型转换引用[2]。 最后,生成相关问题,比如nullptr与NULL的区别、解决的重载问题示例、类型转换规则等,帮助用户进一步学习。</think>### C++11空指针常量关键字nullptr详解 #### 1. 背景与必要性 C语言中空指针使用$NULL$宏定义,但在C++中可能引发**类型歧义**问题。 - C++中$NULL$定义为$0$,C中$NULL$定义为$(void*)0$[^1] - 函数重载,调用$f(NULL)$会被解析为整型参数而非指针参数 例如: ```cpp void f(int x); // 重载1 void f(int* ptr); // 重载2 f(NULL); // 调用重载1,而非预期重载2[^3] ``` #### 2. 核心特性 `nullptr`是C++11引入的**类型安全空指针常量**: - 类型为`std::nullptr_t`,可隐式转换为任意指针类型[^2] - 不能隐式转换为整型(如$int$)或$bool$以外的类型 ```cpp int* p = nullptr; // ✔️ 合法 int a = nullptr; // ❌ 编译错误[^1] ``` #### 3. 关键优势 | 特性 | NULL | nullptr | |---------------|-----------------------|---------------------| | 类型 | 整型字面量$0$ | 专用空指针类型`nullptr_t` | | 隐式转换范围 | 整型/指针类型均可 | 仅限指针类型[^2] | | 函数重载解析 | 可能误选整型重载版本 | 精准匹配指针重载版本[^3] | #### 4. 典型应用场景 ```cpp // 正确调用指针版本的重载函数 f(nullptr); // 调用void f(int* ptr)[^3] // 初始化指针变量 int* arr = nullptr; std::shared_ptr<Object> obj = nullptr; // 条件判断 if (ptr == nullptr) { /* 安全检测 */ } ``` #### 5. 类型转换规则 - 允许转换为所有指针类型(包括成员指针) - 可隐式转换为$bool$类型(值为$false$) - 允许与指针类型比较(如$ptr == nullptr$),但禁止与整型比较[^2]
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值