我有以下代码:
#include <iostream>
using namespace std;
class Base
{
private:
int i;
char ch;
public:
void showdata()
{
cout<<"Int:"<<i<<endl;
cout<<"Char:"<<ch<<endl;
}
//int pub_data ;
} ;
int main()
{
Base ob;
ob.showdata() ;
//cout<<"Public Data:"<<ob.pub_data<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序编译并运行正常.输出显示i初始化为0,ch初始化为'\ 0'.
如果你注意到我在这个程序中注释了2个语句.首先声明公共数据pub_data和第二行内部主要打印这个公共数据.
现在问题是,如果我取消注释这两行,类似i,ch,pub_data的数据成员似乎没有被初始化,并且在打印时,它们显示垃圾值.
所以我的问题是公共数据与此有何不同?
我正在使用g ++ 3.4.6
让我们假设以下类定义:
public class A {
public final static String SOME_VALUE;
static {
SOME_VALUE = "some.value";
}
}
public class B {
private final String value = A.SOME_VALUE;
}
Run Code Online (Sandbox Code Playgroud)
假设A类尚未加载,当某个线程T实例化B类对象时会发生什么?必须首先加载和实例化A类.但我的问题是:如果它是在线程T的上下文中完成的,或者更确切地说是在其他(特殊)"类加载器"线程的上下文中完成的?
在构造函数中,指定的最终对象字段是否仍然为空?
class MyClass {
private final Object obj = new Object();
public MyClass() {
System.out.println(obj); // may print null?
}
}
Run Code Online (Sandbox Code Playgroud)
如果是的话,这不是一个错误吗?
我有一个C#/ ASP.NET .aspx页面,它声明了两个控件,每个控件代表一个选项卡的内容.我想要一个查询字符串参数(例如,?tab = 1)来确定激活两个控件中的哪一个.我的问题是,它们都经历了初始化事件并填充了它们的子控件,浪费了CPU资源并减慢了响应时间.是否有可能以某种方式停用它们以便它们不进行任何初始化?
我的.aspx页面如下所示:
<% if (TabId == 0)
{ %>
<my:usercontroltabone id="ctrl1" runat="server" />
<% }
else if (TabId == 1)
{ %>
<my:usercontroltabtwo id="ctrl2" runat="server" />
<% } %>
Run Code Online (Sandbox Code Playgroud)
那部分工作正常.我假设<%'意味着控件实际上不会被声明,所以不会初始化,但事实并非如此......
如何抑制类型的自动初始化和销毁?虽然T buffer[100]
自动初始化所有元素buffer
并在它们超出范围时销毁它们是很棒的,但这不是我想要的行为.
#include <iostream>
static int created = 0,
destroyed = 0;
struct S
{
S()
{
++created;
}
~S()
{
++destroyed;
}
};
template <typename T, size_t KCount>
class fixed_vector
{
private:
T m_buffer[KCount];
public:
fixed_vector()
{
// some way to suppress the automatic initialization of m_buffer
}
~fixed_vector()
{
// some way to suppress the automatic destruction of m_buffer
}
};
int main()
{
{
fixed_vector<S, 100> arr;
}
std::cout << "Created:\t" << created …
Run Code Online (Sandbox Code Playgroud) 我正在阅读MCTS Self Paced Training Kit(70-536)Edition 2,在第1章我们有以下内容.
如何声明值类型变量要使用类型,必须首先将符号声明为该类型的实例.值类型具有隐式构造函数,因此声明它们会自动实例化类型; 您不必像处理类一样包含New关键字.构造函数为新实例分配一个默认值(通常为null或0),但是您应该始终在声明中显式初始化该变量,如以下代码块所示:
'VB
Dim b As Boolean = False
// C#
bool b = false;
Run Code Online (Sandbox Code Playgroud)
但是,当我编译以下控制台应用程序时,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ch1_70_536
{
class Program
{
static void Main(string[] args)
{
bool b;
Console.WriteLine("The value of b is " + b);
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到编译时错误
"使用未分配的局部变量b"
在勘误表中甚至没有提到它.我做错了还是这本书完全错了?
如果我在不同的编译单元中有两个静态变量,则不会定义它们的初始化顺序.这一课很好学.
我遇到的问题是:当第一个静态变量被初始化时,它们已经分配了所有静态变量.换一种说法:
static A global_a; // in compilation unit 1
static B global_b; // in compilation unit 2
struct A {
A() { b_ptr = &global_b; }
B *b_ptr;
void f() { b_ptr->do_something(); }
}
int main() {
global_a.f();
}
Run Code Online (Sandbox Code Playgroud)
b_ptr是否指向一个有效的内存块,其中B是在执行main函数时分配和初始化的?在所有平台上?
更长的故事:
编译单元1是Qt库.另一个是我的申请.我有几个QObject派生类,我需要能够通过类名字符串实例化.为此我想出了一个模板化的工厂类:
class AbstractFactory {
public:
virtual QObject *create() = 0;
static QMap<const QMetaObject *, AbstractFactory *> m_Map;
}
QMap<const QMetaObject *, AbstractFactory *> AbstractFactory::m_Map; //in .cpp
template <class T>
class ConcreteFactory: public AbstractFactory {
public:
ConcreteFactory() { AbstractFactory::m_Map[&T::staticMetaObject] …
Run Code Online (Sandbox Code Playgroud) 我刚读过SUN的java代码约定 ; 非常好的文件btw.我读过这个
6.3初始化:尝试初始化声明它们的局部变量.没有初始化声明的变量的唯一原因是初始值取决于首先发生的某些计算.
而且我想知道是否Class variables
有相同的建议,例如我有:
public class NNmatrix {
protected ArrayList<ArrayList<Double>> matrix; // line 1
public NNmatrix() {
matrix = new ArrayList<ArrayList<Double>>(); // line 2
}
/**
*
* @param otherMtrx
*/
public NNmatrix(final ArrayList<ArrayList<Double>> otherMtrx) {
final int rows = otherMtrx.size();
matrix = new ArrayList<ArrayList<Double>>(rows); // line3
for (int i = 0; i < rows; i++) {
this.matrix.add(new ArrayList<Double>(otherMtrx.get(i)));
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑代码#如果我要初始化variable
声明的位置(在课堂上),我会删除 "第2行"并留下 "第3行"因为你知道性能问题#reserving(rows)在内存中.
问题是:
以下代码行,在堆栈上创建一个可变长度数组:
char name[length] = {'\0'};
Run Code Online (Sandbox Code Playgroud)
生成以下编译器诊断:
error: variable-sized object may not be initialized
warning: excess elements in array initializer
warning: (near initialization for ‘name’)
Run Code Online (Sandbox Code Playgroud)
有哪些选项可用于初始化VLA?我被迫使用如下行:
memset(name, 0, sizeof(name));
Run Code Online (Sandbox Code Playgroud)
代替?
我有一个以块的形式读取文件的函数.
public static DataObject ReadNextFile(){ ...}
Run Code Online (Sandbox Code Playgroud)
dataobject看起来像这样:
public DataObject
{
public string Category { get; set; }
// And other members ...
}
Run Code Online (Sandbox Code Playgroud)
基本上我想做的是以下内容
List<DataObject> dataObjects = new List<DataObject>();
while(ReadNextFile().Category == "category")
{
dataObjects.Add(^^^^^ the thingy in the while);
}
Run Code Online (Sandbox Code Playgroud)
我知道它可能不是这样做的,因为我如何访问我刚读过的对象.
initialization ×10
c# ×3
c++ ×3
java ×3
constructor ×2
variables ×2
arrays ×1
asp.net ×1
c ×1
classloader ×1
declaration ×1
destructor ×1
gcc ×1
null ×1
static ×1
while-loop ×1