关注C++细节——动态生成对象初始化细节

①T *p =new T;

②T *p =new T();

这两类用法不同点的总结。

1.若T为类类型,且用户定义了构造函数,则两种形式的效果完全相同,都会调用这个定义了的构造函数来初始化内部成员变量,但是如果此构造函数中并未对成员变量初始化,则这个时候内部的成员变量进行默认初始化——值是未定义的。

2.若T为类类型,但是用户并没有定义任何构造函数,则我们可以知道编译器会为该类合成一个默认的构造函数,这个时候上述两种形式的结果就不同了,①的类内部的成员变量这个时候执行默认初始化,其值是未定义的。但是在②中就不同了,加了括号后,p内部的成员变量会执行值初始化,即以0的形式进行初始化(整数就为0,bool就为false,string 就为空)

3.若T为内置类型,则①的形式中*p的值为未定义的,②中进行值初始化如上。

下面针对上面各种情况进行编程测试。

1.显示定义构造函数,但构造函数并不对成员变量进行初始化,则无论①②都输出的a都是未定义的值。

class Test{
public:
	Test(){
		printf("constructor\n");
	}

	int getA()const{
		return a;
	}

private:
	int a;
};

int main(){
	Test *pta = new Test;
	Test *ptb = new Test();

	printf("a : %d\n", pta->getA());
	printf("a : %d\n", ptb->getA());
	return 0;
}

2.显示定义构造函数,并且构造函数中对成员变量就行初始化,则①②中a都是构造后的值。

class Test{
public:
	Test() : a(0){
		printf("constructor\n");
	}

	int getA()const{
		return a;
	}

private:
	int a;
};

int main(){
	Test *pta = new Test;
	Test *ptb = new Test();

	printf("a : %d\n", pta->getA());//output zero
	printf("a : %d\n", ptb->getA());//output zero
	return 0;
}

以上两个例子说明,只要定义了构造函数,无论new的时候加不加括号,都会调用自身已有的构造函数。

3.类中不定义任何构造函数,而使用编译器合成的默认构造函数。

class Test{
public:
	int getA()const{
		return a;
	}

private:
	int a;
};

int main(){
	Test *pta = new Test;
	Test *ptb = new Test();

	printf("a : %d\n", pta->getA());//undefined value       a->default initializer
	printf("a : %d\n", ptb->getA());//output zero			a->value initializer
	return 0;
}

4.内置类型的两种形式。

int main(){
	int *pia = new int;
	int *pib = new int();

	printf("%d\n", *pia);//undefined value
	printf("%d\n", *pib);//ouput zero
	return 0;
}

关注C++细节——动态生成对象初始化细节

时间: 2024-10-05 04:29:14

关注C++细节——动态生成对象初始化细节的相关文章

C++ 动态生成对象

1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西. 在谈一谈动态生成对象,为什么强大的C++不支持呢?想用这样功能的人都必须自己实现一套这样的逻辑. 2.实现理由 有时候开发真是有些矛盾,例如:1.实现一个功能可以使用大量相似的代码.也可以使用模板,那我们怎么选择呢? 2.如果实现一个类之后,他有大量的属性,而且这些属性都需要set和get方法,

利用runtime动态生成对象?

利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @"DYViewController"; const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding]; 2)从一个字符串返回一个Class Class newClass = objc_getClass(

python-根据字符串动态生成对象eval

# -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", 'stockCode':"000410", 'averagePrice_yesterday':34.08, 'averagePrice_today':35.49, 'position_old':0.0941350558312, } stock2={ 'stockName':"暴风科技", 'stockCode':"300431&qu

Cglib根据数据库表数据动态生成对象

最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import java.util import net.sf.cglib.beans.{BeanGenerator, BeanMap} /** * 动态Bean生成 * * @author BarryWang create at 2018/6/19 11:54 * @version 0.0.1 */class Dyna

WPF 动态生成对象属性 (dynamic)

原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量~ 参考文章 https://www.cnblogs.com/maomiyouai/p/3594132.html https://www.cnblogs.com/dingli/archive/2012/06/14/2548687.html(这个没看明白 但是冥冥中让我觉得 收藏一下以后可能会用) 代

通过js动态生成对象,并给对象赋值

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <

WPF Datagrid 动态生成列 并绑定数据

原文:WPF Datagrid 动态生成列 并绑定数据 说的是这里 因为列头是动态加载的 (后台for循环 一会能看到代码) 数据来源于左侧列 左侧列数据源 当然num1 属于临时的dome使用  可以用ObservableCollection集合代表 动态创建属性 WPF 动态生成对象属性 (dynamic) ObservableCollection<NameList> listName = new ObservableCollection<NameList>(); privat

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

jquery对象的细节操作1

jquery是前台动态页面开发的一个很重要的工具. 一:jquery对象中length属性和size()方法 var a=$("a").length;         var b=$("a").size(); length--->返回匹配元素对象的个数 size()--->返回被 jQuery 选择器匹配的元素的数量 暂时未发现,两个有何不同. [1]当判断一个对象是否存在是,可以用length属性: 存在长度>=1 不存在长度==0 二:jque