当我使用new []创建我的类数组时:
int count = 10;
A *arr = new A[count];
Run Code Online (Sandbox Code Playgroud)
我看到它调用了一个默认的构造函数A count.其结果是arr已经count初始化的类型的对象A.但是,如果我使用相同的东西来构造一个int数组:
int *arr2 = new int[count];
Run Code Online (Sandbox Code Playgroud)
它没有初始化.所有值都类似于-842150451int的默认构造函数将其值赋值给0.
为什么会有这么不同的行为?默认构造函数是否仅针对内置类型调用?
new运营商和Class.forName(...).newInstance()?有什么区别?它们都创建了一个类的实例,我不确定它们之间的区别.
我是java的新手.
在java中,String是一个class.但是我们不必使用new关键字来创建类的对象,String其中new用于为其他类创建对象.
我听说过类似的Wrapper类Integer,Double它们与此类似.但String不是Wrapper,不是吗?
实际上当我使用时发生了什么
     String message = "Hai";
Run Code Online (Sandbox Code Playgroud)
?? 它有什么不同
String message = new String("Hai");
Run Code Online (Sandbox Code Playgroud)
这是message一个参考变量或其他?是否有其他类不需要new创建对象?
这两行之间没有区别,因为第二行中的编译器理解它是int类型的数组.
var x = new int[] { 1, 2, 3 };   //Fine, x is int[]
var x = new [] { 1, 2, 3 };      //Fine, x is int[]
Run Code Online (Sandbox Code Playgroud)
但为什么我不能用不同类型做到这一点?为什么编译器不将我的变量转换为类型对象?
var x = new object[] { 1, "df", 5 };   //Fine, x is object[]
var x = new [] { 1, "df", 5 };         //Error! "No best type found for implicity-typed-array"
Run Code Online (Sandbox Code Playgroud)
编辑:
谢谢你的所有答案.但我仍然想知道,使编译器无法转换为类型的所有表达式的优缺点是object什么?(因为我使用var符号,这意味着它不能是任何类型.我这样理解.)为什么编译器不通过继承树找到最近类型的数组成员?
我已分配和对象数组
Objects *array = new Objects[N];
Run Code Online (Sandbox Code Playgroud)
我该如何删除这个数组?只是
delete[] array;
Run Code Online (Sandbox Code Playgroud)
或者迭代数组的元素?
for(int i=0;i<N;i++)
    delete array[i];
delete[];
Run Code Online (Sandbox Code Playgroud)
谢谢
更新:
我改变了循环体
delete &array[i];
Run Code Online (Sandbox Code Playgroud)
强制代码编译.
我正在尝试从我在Lua中使用的库中包装一个类.特别是,我正在尝试从SFML中包装颜色类.在这里和这里可以看到颜色类的完整源代码.
这就是我失败的功能.
int SFColor_new(lua_State* L)
{
    // omitting part where I set r, g, b, and a
    new (lua_newuserdata(L, sizeof(Color))) Color(r, g, b, a); // Line 47
    luaL_getmetatable(L, LuaInfo<Color>::myMetaTableName);
    lua_setmetatable(L, -2);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)
这就是错误
LuaSFMLColor.cpp: In function ‘int ag::SFColor_new(lua_State*)’:
LuaSFMLColor.cpp:47: error: no matching function for call to ‘operator new(unsigned int, void*)’
<built-in>:0: note: candidates are: void* operator new(unsigned int)
make: *** [game] Error 1
Run Code Online (Sandbox Code Playgroud)
我在其他几个地方做类似的事情而没有遇到这个错误,所以我不确定是什么原因导致它.看看Color的源代码,我没有看到任何奇怪或不同寻常的东西,而且我已经没有想法了.我也尝试使用默认构造函数(即没有参数)然后只是设置值,但这也没有任何好处.
只是好奇,有什么区别:
int A = 100;
Run Code Online (Sandbox Code Playgroud)
和
int A = new int();  
Run Code Online (Sandbox Code Playgroud)
我知道new用于在堆上分配内存..但我真的没有在这里得到上下文.
我刚刚注册了,但是自从我开始学习计算机编程以来,我一直在很好地利用这个网站,我一直在自学并考虑我的一点兴趣.
我确实在寻找类似的问题,但实际上我找不到我想要的答案.现在,意识到,在Java(这是我建议开始使用的语言)中,根据需要声明和实例化变量被认为是很好的编程习惯,请考虑以下几行:
class MyClass {
    void myMethod() {
        AnotherClass myObject = new AnotherClass();
        myObject.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)
现在,假设我在运行程序时调用了myMethod()10次,那有什么用呢?每次创建一个新对象吗?每次都重新分配myObject变量吗?编译器是否会跳过代码,因为它看到对象已经创建并且变量myObject已经分配给了这样的对象?简而言之:只有当我打算只调用一次该方法时,我才能编写这样的代码吗?我知道......因为问这么愚蠢的问题而感到羞耻,但请给我一个机会!提前致谢!
---------------------------编辑---------------------- -------
所以现在我应该在得到新答案后编辑这篇文章吗?顺便说一下...天哪,很快,非常感谢!哇我很困惑,我想这是因为我一直在教自己......不管怎样,每次new AnotherClass为myObject变量创建一个Object 都没用?我的意思是,如果我想在整个程序中使用myObject变量,那么我不应该声明它一劳永逸吗?也许在另一种方法中,我只会调用一次?因为据我所知,每次调用myMethod()一个新对象时都会创建,从而覆盖myObject自己的属性,即变量,或者我只是在胡说八道?
---------------------------编辑---------------------- -------
我从一些我现在不记得的网站上读到这段代码后出现了疑问:
    public class DataBase {
    private static String buf, retString = "\n";
    private static File file = new File("test.txt");
    public static void readText(JTextArea area) {   
        try {
            FileReader fr = new FileReader (file);
            BufferedReader br = new BufferedReader(fr);
            while ((buf = br.readLine()) != null) {
                area.append(buf); 
                area.append(retString);
            }
            br.close(); 
            fr.close(); …Run Code Online (Sandbox Code Playgroud) 今天,我在遗留代码中找到了一些东西.它具有一个功能的"静态新".看起来像这样.
class Foo
{
    public static void Do()
    {
        Console.WriteLine("Foo.Do");
    }
}
class Bar: Foo
{
    public static new void Do()
    {
        Console.WriteLine("Bar.Do");
    }
}
Run Code Online (Sandbox Code Playgroud)
我不理解类Bar中的Do方法的静态new修饰符.在C#中,静态方法只能使用类名而不是对象名来调用.因此,我认为拥有"新"与否之间没有任何区别.
通常,如果某些语法不必要,C#只会将其视为错误.任何人都知道为什么C#允许这样的语法?
为什么C++没有直接对应于贴图新的贴片删除,即调用析构函数并调用适当的贴片删除操作符?
例如:
MyType *p = new(arena) MyType;
...
//current technique
p->~MyType();
operator delete(p, arena);
//proposed technique
delete(arena) p;
Run Code Online (Sandbox Code Playgroud) new-operator ×10
c++ ×4
c# ×3
java ×3
object ×3
arrays ×2
.net ×1
c#-4.0 ×1
c++11 ×1
constructor ×1
modifier ×1
reflection ×1
standards ×1
static ×1
string ×1